From 5df0a67da7a40e693cafa31dac471829271c25a0 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 28 May 2024 14:40:59 +0200 Subject: [PATCH] Bugfix: Search results for data types --- .../data-type-picker-flow-modal.element.ts | 65 +++++++++++++++---- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index 562e203141..d822d1ba00 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -20,6 +20,7 @@ import { UMB_CONTENT_TYPE_WORKSPACE_CONTEXT, UMB_PROPERTY_TYPE_WORKSPACE_CONTEXT, } from '@umbraco-cms/backoffice/content-type'; +import { UmbPaginationManager, debounce } from '@umbraco-cms/backoffice/utils'; interface GroupedItems { [key: string]: Array; @@ -45,9 +46,14 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< @state() private _submitLabel = 'Select'; + @state() + private _currentPage = 1; + @state() private _dataTypePickerModalRouteBuilder?: UmbModalRouteBuilder; + pagination = new UmbPaginationManager(); + private _createDataTypeModal!: UmbModalRouteRegistrationController; #collectionRepository; @@ -73,15 +79,10 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< } async #init() { + this.pagination.setCurrentPageNumber(1); + this.pagination.setPageSize(100); + this.#initPromise = Promise.all([ - this.observe( - (await this.#collectionRepository.requestCollection({ skip: 0, take: 100 })).asObservable(), - (dataTypes) => { - this.#dataTypes = dataTypes; - this._performFiltering(); - }, - '_repositoryItemsObserver', - ).asPromise(), this.observe(umbExtensionsRegistry.byType('propertyEditorUi'), (propertyEditorUIs) => { // Only include Property Editor UIs which has Property Editor Schema Alias this.#propertyEditorUIs = propertyEditorUIs.filter( @@ -144,6 +145,24 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< }); } + async #getDataTypes() { + this.pagination.setCurrentPageNumber(this._currentPage); + + const { data } = await this.#collectionRepository.requestCollection({ + skip: this.pagination.getSkip(), + take: this.pagination.getPageSize(), + name: this.#currentFilterQuery, + }); + + this.pagination.setTotalItems(data?.total ?? 0); + + if (this.pagination.getCurrentPageNumber() > 1) { + this.#dataTypes = [...this.#dataTypes, ...(data?.items ?? [])]; + } else { + this.#dataTypes = data?.items ?? []; + } + } + private _handleDataTypeClick(dataType: UmbDataTypeItemModel) { if (dataType.unique) { this._select(dataType.unique); @@ -155,11 +174,26 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< this.value = { selection: unique ? [unique] : [] }; } - private _handleFilterInput(event: UUIInputEvent) { - const query = (event.target.value as string) || ''; - this.#currentFilterQuery = query.toLowerCase(); + async #onLoadMore() { + this._currentPage = this._currentPage + 1; + this.#handleFiltering(); + } + + #onFilterInput(event: UUIInputEvent) { + this.#currentFilterQuery = (event.target.value as string).toLocaleLowerCase(); + this.#debouncedFilterInput(); + } + + #debouncedFilterInput = debounce(() => { + this._currentPage = 1; + this.#handleFiltering(); + }, 250); + + async #handleFiltering() { + await this.#getDataTypes(); this._performFiltering(); } + private _performFiltering() { if (this.#currentFilterQuery) { const filteredDataTypes = this.#dataTypes.filter((dataType) => @@ -213,7 +247,7 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< return html` @@ -238,7 +272,7 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< dataTypesEntries.length > 0, () => html`
Available configurations
- ${this._renderDataTypes()}`, + ${this._renderDataTypes()}${this.#renderLoadMore()}`, )} ${when( editorUIEntries.length > 0, @@ -249,6 +283,11 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< `; } + #renderLoadMore() { + if (this._currentPage >= this.pagination.getTotalPages()) return; + return html``; + } + private _renderDataTypes() { if (!this._groupedDataTypes) return nothing;