diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/repository/collection-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/repository/collection-data-source.interface.ts index 315782b7ab..3735c17e9d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/repository/collection-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/repository/collection-data-source.interface.ts @@ -1,6 +1,10 @@ import type { UmbDataSourceResponse } from '../../repository/index.js'; import type { UmbPagedModel } from '../../repository/types.js'; +import type { UmbCollectionFilterModel } from '../collection-filter-model.interface.js'; -export interface UmbCollectionDataSource { +export interface UmbCollectionDataSource< + CollectionItemType extends { entityType: string; unique: string } = any, + FilterType extends UmbCollectionFilterModel = UmbCollectionFilterModel, +> { getCollection(filter: FilterType): Promise>>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/repository/collection-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/repository/collection-repository.interface.ts index 49a73f110c..68396a73b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/repository/collection-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/repository/collection-repository.interface.ts @@ -1,5 +1,10 @@ +import type { UmbCollectionFilterModel } from '../collection-filter-model.interface.js'; +import type { UmbPagedModel, UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export interface UmbCollectionRepository extends UmbApi { - requestCollection(filter?: any): Promise; +export interface UmbCollectionRepository< + CollectionItemType extends { entityType: string; unique: string } = any, + FilterType extends UmbCollectionFilterModel = UmbCollectionFilterModel, +> extends UmbApi { + requestCollection(filter?: FilterType): Promise>>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/extension-collection.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/extension-collection.element.ts index d0716b4896..205df5335d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/extension-collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/extension-collection.element.ts @@ -36,9 +36,9 @@ export class UmbExtensionCollectionElement extends UmbCollectionDefaultElement { #onSearch(event: InputEvent) { const target = event.target as HTMLInputElement; - const query = target.value || ''; + const filter = target.value || ''; clearTimeout(this.#inputTimer); - this.#inputTimer = setTimeout(() => this.#collectionContext?.setFilter({ filter: query }), this.#inputTimerAmount); + this.#inputTimer = setTimeout(() => this.#collectionContext?.setFilter({ filter }), this.#inputTimerAmount); } protected renderToolbar() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/repository/extension-collection.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/repository/extension-collection.repository.ts index 20c8a40094..269795567a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/repository/extension-collection.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/repository/extension-collection.repository.ts @@ -1,39 +1,35 @@ import { umbExtensionsRegistry } from '../../registry.js'; -import type { ManifestTypes } from '../../models/index.js'; +import type { UmbExtensionCollectionFilterModel } from '../types.js'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbCollectionRepository } from '@umbraco-cms/backoffice/collection'; -export interface UmbExtensionCollectionFilter { - query?: string; - skip: number; - take: number; - type?: ManifestTypes['type']; -} - export class UmbExtensionCollectionRepository extends UmbRepositoryBase implements UmbCollectionRepository { constructor(host: UmbControllerHost) { super(host); } - async requestCollection(filter: UmbExtensionCollectionFilter) { + async requestCollection(query: UmbExtensionCollectionFilterModel) { let extensions = umbExtensionsRegistry.getAllExtensions(); - if (filter.query) { - const query = filter.query.toLowerCase(); + const skip = query.skip || 0; + const take = query.take || 100; + + if (query.filter) { + const text = query.filter.toLowerCase(); extensions = extensions.filter( - (x) => x.name.toLowerCase().includes(query) || x.alias.toLowerCase().includes(query), + (x) => x.name.toLowerCase().includes(text) || x.alias.toLowerCase().includes(text), ); } - if (filter.type) { - extensions = extensions.filter((x) => x.type === filter.type); + if (query.type) { + extensions = extensions.filter((x) => x.type === query.type); } extensions.sort((a, b) => a.type.localeCompare(b.type) || a.alias.localeCompare(b.alias)); const total = extensions.length; - const items = extensions.slice(filter.skip, filter.skip + filter.take); + const items = extensions.slice(skip, skip + take); const data = { items, total }; return { data }; } @@ -41,4 +37,4 @@ export class UmbExtensionCollectionRepository extends UmbRepositoryBase implemen destroy(): void {} } -export default UmbExtensionCollectionRepository; +export { UmbExtensionCollectionRepository as api };