From 1d098410978e6c32e73cb988bea59f0b6f0a7556 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:51:29 +0200 Subject: [PATCH] media --- .../src/packages/media/media/manifests.ts | 2 + .../item/media-item.server.data-source.ts | 2 + .../media/media/repository/item/types.ts | 2 + .../packages/media/media/search/manifests.ts | 21 ++++++ .../media/search/media-search.repository.ts | 23 +++++++ .../search/media-search.server.data-source.ts | 65 +++++++++++++++++++ .../media/search/media.search-provider.ts | 20 ++++++ 7 files changed, 135 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/search/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts index cbdd5167a5..b0276fdcdf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts @@ -5,6 +5,7 @@ import { manifests as menuManifests } from './menu/manifests.js'; import { manifests as propertyEditorsManifests } from './property-editors/manifests.js'; import { manifests as recycleBinManifests } from './recycle-bin/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as searchManifests } from './search/manifests.js'; import { manifests as sectionViewManifests } from './section-view/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; @@ -17,6 +18,7 @@ export const manifests = [ ...propertyEditorsManifests, ...recycleBinManifests, ...repositoryManifests, + ...searchManifests, ...sectionViewManifests, ...treeManifests, ...workspaceManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.server.data-source.ts index a1ffb549c7..77c9bda32c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.server.data-source.ts @@ -1,3 +1,4 @@ +import { UMB_MEDIA_ENTITY_TYPE, UmbMediaEntityType } from '../../entity.js'; import type { UmbMediaItemModel } from './types.js'; import type { MediaItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; @@ -32,6 +33,7 @@ const getItems = (uniques: Array) => MediaService.getItemMedia({ id: uni const mapper = (item: MediaItemResponseModel): UmbMediaItemModel => { return { + entityType: UMB_MEDIA_ENTITY_TYPE, unique: item.id, isTrashed: item.isTrashed, mediaType: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/types.ts index 5d9b42300e..5dd1780a06 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/types.ts @@ -1,6 +1,8 @@ +import type { UmbMediaEntityType } from '../../entity.js'; import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; export interface UmbMediaItemModel { + entityType: UmbMediaEntityType; unique: string; isTrashed: boolean; mediaType: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/manifests.ts new file mode 100644 index 0000000000..fa80755e07 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/manifests.ts @@ -0,0 +1,21 @@ +import { UMB_MEDIA_ENTITY_TYPE } from '../entity.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + name: 'Media Search Provider', + alias: 'Umb.SearchProvider.Media', + type: 'searchProvider', + api: () => import('./media.search-provider.js'), + weight: 1000, + meta: { + label: 'Media', + }, + }, + { + name: 'Media Search Result Item ', + alias: 'Umb.SearchResultItem.Media', + type: 'searchResultItem', + forEntityTypes: [UMB_MEDIA_ENTITY_TYPE], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.repository.ts new file mode 100644 index 0000000000..4d00fca682 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.repository.ts @@ -0,0 +1,23 @@ +import type { UmbSearchRepository, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; +import { UmbMediaSearchServerDataSource } from './media-search.server.data-source.js'; +import type { UmbMediaSearchItemModel } from './media.search-provider.js'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbMediaSearchRepository + extends UmbControllerBase + implements UmbSearchRepository, UmbApi +{ + #dataSource: UmbMediaSearchServerDataSource; + + constructor(host: UmbControllerHost) { + super(host); + + this.#dataSource = new UmbMediaSearchServerDataSource(this); + } + + search(args: UmbSearchRequestArgs) { + return this.#dataSource.search(args); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts new file mode 100644 index 0000000000..998a7daa12 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts @@ -0,0 +1,65 @@ +import type { UmbSearchDataSource, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; +import { UMB_MEDIA_ENTITY_TYPE } from '../entity.js'; +import type { UmbMediaSearchItemModel } from './media.search-provider.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the Rollback that fetches data from the server + * @export + * @class UmbMediaSearchServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbMediaSearchServerDataSource implements UmbSearchDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMediaSearchServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMediaSearchServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Get a list of versions for a data + * @return {*} + * @memberof UmbMediaSearchServerDataSource + */ + async search(args: UmbSearchRequestArgs) { + const { data, error } = await tryExecuteAndNotify( + this.#host, + MediaService.getItemMediaSearch({ + query: args.query, + }), + ); + + if (data) { + const mappedItems: Array = data.items.map((item) => { + return { + entityType: UMB_MEDIA_ENTITY_TYPE, + unique: item.id, + isTrashed: item.isTrashed, + mediaType: { + unique: item.mediaType.id, + icon: item.mediaType.icon, + collection: item.mediaType.collection ? { unique: item.mediaType.collection.id } : null, + }, + variants: item.variants.map((variant) => { + return { + culture: variant.culture || null, + name: variant.name, + }; + }), + name: item.variants[0]?.name, // TODO: get correct variant name + }; + }); + + return { data: { items: mappedItems, total: data.total } }; + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts new file mode 100644 index 0000000000..dd8c80a930 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts @@ -0,0 +1,20 @@ +import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; +import type { UmbMediaItemModel } from '../index.js'; +import { UmbMediaSearchRepository } from './media-search.repository.js'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; + +export interface UmbMediaSearchItemModel extends UmbMediaItemModel {} + +export class UmbMediaSearchProvider extends UmbControllerBase implements UmbSearchProvider { + #repository = new UmbMediaSearchRepository(this); + + async search(args: UmbSearchRequestArgs) { + return this.#repository.search(args); + } + + destroy(): void { + this.#repository.destroy(); + } +} + +export { UmbMediaSearchProvider as api };