This commit is contained in:
JesmoDev
2024-04-15 12:51:29 +02:00
parent 6ee54436c9
commit 1d09841097
7 changed files with 135 additions and 0 deletions

View File

@@ -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,

View File

@@ -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<string>) => MediaService.getItemMedia({ id: uni
const mapper = (item: MediaItemResponseModel): UmbMediaItemModel => {
return {
entityType: UMB_MEDIA_ENTITY_TYPE,
unique: item.id,
isTrashed: item.isTrashed,
mediaType: {

View File

@@ -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: {

View File

@@ -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<ManifestTypes> = [
{
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],
},
];

View File

@@ -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<UmbMediaSearchItemModel>, UmbApi
{
#dataSource: UmbMediaSearchServerDataSource;
constructor(host: UmbControllerHost) {
super(host);
this.#dataSource = new UmbMediaSearchServerDataSource(this);
}
search(args: UmbSearchRequestArgs) {
return this.#dataSource.search(args);
}
}

View File

@@ -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<UmbMediaSearchItemModel> {
#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<UmbMediaSearchItemModel> = 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 };
}
}

View File

@@ -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<UmbMediaSearchItemModel> {
#repository = new UmbMediaSearchRepository(this);
async search(args: UmbSearchRequestArgs) {
return this.#repository.search(args);
}
destroy(): void {
this.#repository.destroy();
}
}
export { UmbMediaSearchProvider as api };