Add explicit Global Search extension point (#19348)
* add global search extension * render global search extension in search modal * register document global search * add media global search * add data type global search * add dictionary global search * import manifests * register document type global search * add media type global search * register member global search * register member type global search * register template global search * export missing consts * export missing consts * export missing consts * add conditions
This commit is contained in:
@@ -5,8 +5,10 @@ export * from './modals/constants.js';
|
||||
export * from './paths.js';
|
||||
export * from './reference/constants.js';
|
||||
export * from './repository/constants.js';
|
||||
export * from './search/constants.js';
|
||||
export * from './tree/constants.js';
|
||||
export * from './workspace/constants.js';
|
||||
|
||||
export {
|
||||
UMB_DATA_TYPE_ENTITY_TYPE,
|
||||
UMB_DATA_TYPE_ROOT_ENTITY_TYPE,
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_DATA_TYPE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.DataType';
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_DATA_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.DataType';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_DATA_TYPE_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_DATA_TYPE_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
import { UMB_SETTINGS_SECTION_ALIAS } from '@umbraco-cms/backoffice/settings';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Data Type Global Search',
|
||||
alias: UMB_DATA_TYPE_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 400,
|
||||
meta: {
|
||||
label: 'Data Types',
|
||||
searchProviderAlias: UMB_DATA_TYPE_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_SETTINGS_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,4 +1,5 @@
|
||||
import { UMB_DATA_TYPE_ENTITY_TYPE } from '../entity.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
@@ -17,4 +18,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
type: 'searchResultItem',
|
||||
forEntityTypes: [UMB_DATA_TYPE_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_DICTIONARY_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Dictionary';
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_DICTIONARY_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Dictionary';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_DICTIONARY_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_DICTIONARY_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
import { UMB_TRANSLATION_SECTION_ALIAS } from '@umbraco-cms/backoffice/translation';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Dictionary Global Search',
|
||||
alias: UMB_DICTIONARY_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 600,
|
||||
meta: {
|
||||
label: 'Dictionary',
|
||||
searchProviderAlias: UMB_DICTIONARY_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_TRANSLATION_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,5 +1,6 @@
|
||||
import { UMB_DICTIONARY_ENTITY_TYPE } from '../entity.js';
|
||||
import { UMB_DICTIONARY_SEARCH_PROVIDER_ALIAS } from './constants.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
@@ -18,4 +19,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
type: 'searchResultItem',
|
||||
forEntityTypes: [UMB_DICTIONARY_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_DOCUMENT_TYPE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.DocumentType';
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_DOCUMENT_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.DocumentType';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_DOCUMENT_TYPE_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_DOCUMENT_TYPE_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
import { UMB_SETTINGS_SECTION_ALIAS } from '@umbraco-cms/backoffice/settings';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Document Type Global Search',
|
||||
alias: UMB_DOCUMENT_TYPE_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 600,
|
||||
meta: {
|
||||
label: 'Document Types',
|
||||
searchProviderAlias: UMB_DOCUMENT_TYPE_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_SETTINGS_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,5 +1,6 @@
|
||||
import { UMB_DOCUMENT_TYPE_ENTITY_TYPE } from '../entity.js';
|
||||
import { UMB_DOCUMENT_TYPE_SEARCH_PROVIDER_ALIAS } from './constants.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
@@ -19,4 +20,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
element: () => import('./document-type-search-result-item.element.js'),
|
||||
forEntityTypes: [UMB_DOCUMENT_TYPE_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_DOCUMENT_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Document';
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_DOCUMENT_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Document';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_DOCUMENT_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_DOCUMENT_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
import { UMB_CONTENT_SECTION_ALIAS } from '@umbraco-cms/backoffice/content';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Document Global Search',
|
||||
alias: UMB_DOCUMENT_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 800,
|
||||
meta: {
|
||||
label: 'Documents',
|
||||
searchProviderAlias: UMB_DOCUMENT_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_CONTENT_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,5 +1,6 @@
|
||||
import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js';
|
||||
import { UMB_DOCUMENT_SEARCH_PROVIDER_ALIAS } from './constants.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
@@ -19,4 +20,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
element: () => import('./document-search-result-item.element.js'),
|
||||
forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
@@ -5,6 +5,7 @@ export * from './property-type/constants.js';
|
||||
export * from './repository/constants.js';
|
||||
export * from './tree/constants.js';
|
||||
export * from './workspace/constants.js';
|
||||
export * from './search/constants.js';
|
||||
|
||||
export {
|
||||
UMB_MEDIA_TYPE_ENTITY_TYPE,
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_MEDIA_TYPE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.MediaType';
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_MEDIA_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.MediaType';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_MEDIA_TYPE_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_MEDIA_TYPE_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
import { UMB_SETTINGS_SECTION_ALIAS } from '@umbraco-cms/backoffice/settings';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Media Type Global Search',
|
||||
alias: UMB_MEDIA_TYPE_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 500,
|
||||
meta: {
|
||||
label: 'Media Types',
|
||||
searchProviderAlias: UMB_MEDIA_TYPE_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_SETTINGS_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,9 +1,11 @@
|
||||
import { UMB_MEDIA_TYPE_ENTITY_TYPE } from '../entity.js';
|
||||
import { UMB_MEDIA_TYPE_SEARCH_PROVIDER_ALIAS } from './constants.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Media Type Search Provider',
|
||||
alias: 'Umb.SearchProvider.MediaType',
|
||||
alias: UMB_MEDIA_TYPE_SEARCH_PROVIDER_ALIAS,
|
||||
type: 'searchProvider',
|
||||
api: () => import('./media-type.search-provider.js'),
|
||||
weight: 500,
|
||||
@@ -17,4 +19,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
type: 'searchResultItem',
|
||||
forEntityTypes: [UMB_MEDIA_TYPE_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
@@ -3,6 +3,7 @@ export * from './entity-actions/constants.js';
|
||||
export * from './entity-bulk-actions/constants.js';
|
||||
export * from './menu/constants.js';
|
||||
export * from './modals/constants.js';
|
||||
export * from './paths.js';
|
||||
export * from './recycle-bin/constants.js';
|
||||
export * from './reference/constants.js';
|
||||
export * from './repository/constants.js';
|
||||
@@ -10,7 +11,6 @@ export * from './search/constants.js';
|
||||
export * from './tree/constants.js';
|
||||
export * from './url/constants.js';
|
||||
export * from './workspace/constants.js';
|
||||
export * from './paths.js';
|
||||
|
||||
export { UMB_MEDIA_VARIANT_CONTEXT } from './property-dataset-context/media-property-dataset-context.token.js';
|
||||
export {
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_MEDIA_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Media';
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_MEDIA_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Media';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_MEDIA_SECTION_ALIAS } from '../../../media-section/constants.js';
|
||||
import { UMB_MEDIA_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_MEDIA_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Media Global Search',
|
||||
alias: UMB_MEDIA_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 700,
|
||||
meta: {
|
||||
label: 'Media',
|
||||
searchProviderAlias: UMB_MEDIA_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_MEDIA_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,5 +1,6 @@
|
||||
import { UMB_MEDIA_ENTITY_TYPE } from '../entity.js';
|
||||
import { UMB_MEDIA_SEARCH_PROVIDER_ALIAS } from './constants.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
@@ -19,4 +20,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
element: () => import('./media-search-result-item.element.js'),
|
||||
forEntityTypes: [UMB_MEDIA_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
@@ -2,6 +2,7 @@ export * from './entity-actions/constants.js';
|
||||
export * from './paths.js';
|
||||
export * from './property-type/constants.js';
|
||||
export * from './repository/constants.js';
|
||||
export * from './search/constants.js';
|
||||
export * from './tree/constants.js';
|
||||
export * from './workspace/constants.js';
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.MemberType';
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_MEMBER_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.MemberType';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_MEMBER_TYPE_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
import { UMB_SETTINGS_SECTION_ALIAS } from '@umbraco-cms/backoffice/settings';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Member Type Global Search',
|
||||
alias: UMB_MEMBER_TYPE_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 200,
|
||||
meta: {
|
||||
label: 'Member Types',
|
||||
searchProviderAlias: UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_SETTINGS_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,9 +1,11 @@
|
||||
import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../entity.js';
|
||||
import { UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS } from './constants.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Member Type Search Provider',
|
||||
alias: 'Umb.SearchProvider.MemberType',
|
||||
alias: UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS,
|
||||
type: 'searchProvider',
|
||||
api: () => import('./member-type.search-provider.js'),
|
||||
weight: 200,
|
||||
@@ -17,4 +19,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
type: 'searchResultItem',
|
||||
forEntityTypes: [UMB_MEMBER_TYPE_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_MEMBER_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Member';
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_MEMBER_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Member';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_MEMBER_MANAGEMENT_SECTION_ALIAS } from '../../../section/constants.js';
|
||||
import { UMB_MEMBER_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_MEMBER_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Member Global Search',
|
||||
alias: UMB_MEMBER_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 300,
|
||||
meta: {
|
||||
label: 'Members',
|
||||
searchProviderAlias: UMB_MEMBER_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_MEMBER_MANAGEMENT_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,5 +1,6 @@
|
||||
import { UMB_MEMBER_ENTITY_TYPE } from '../entity.js';
|
||||
import { UMB_MEMBER_SEARCH_PROVIDER_ALIAS } from './constants.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
@@ -18,4 +19,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
type: 'searchResultItem',
|
||||
forEntityTypes: [UMB_MEMBER_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
import type { UmbGlobalSearchApi } from './types.js';
|
||||
import type { ManifestWithDynamicConditions, ManifestApi } from '@umbraco-cms/backoffice/extension-api';
|
||||
|
||||
export interface ManifestGlobalSearch
|
||||
extends ManifestApi<UmbGlobalSearchApi>,
|
||||
ManifestWithDynamicConditions<UmbExtensionConditionConfig> {
|
||||
type: 'globalSearch';
|
||||
meta: MetaGlobalSearch;
|
||||
}
|
||||
|
||||
export interface MetaGlobalSearch {
|
||||
label: string;
|
||||
searchProviderAlias: string;
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface UmbExtensionManifestMap {
|
||||
umbGlobalSearch: ManifestGlobalSearch;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
import type { UmbApi } from '@umbraco-cms/backoffice/extension-api';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
||||
export interface UmbGlobalSearchApi extends UmbApi {}
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { UmbSearchProvider, UmbSearchResultItemModel } from '../types.js';
|
||||
import type { ManifestSearchResultItem } from '../extensions/types.js';
|
||||
import type { UmbGlobalSearchApi } from '../global-search/types.js';
|
||||
import {
|
||||
css,
|
||||
html,
|
||||
@@ -12,17 +13,18 @@ import {
|
||||
when,
|
||||
} from '@umbraco-cms/backoffice/external/lit';
|
||||
import { UmbExtensionsManifestInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api';
|
||||
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import { createExtensionApiByAlias, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import type { UmbModalContext } from '@umbraco-cms/backoffice/modal';
|
||||
|
||||
import '../search-result/search-result-item.element.js';
|
||||
|
||||
type SearchProvider = {
|
||||
type GlobalSearchers = {
|
||||
name: string;
|
||||
api: UmbSearchProvider<UmbSearchResultItemModel>;
|
||||
api?: UmbGlobalSearchApi;
|
||||
alias: string;
|
||||
searchProviderApi: UmbSearchProvider<UmbSearchResultItemModel>;
|
||||
};
|
||||
|
||||
@customElement('umb-search-modal')
|
||||
@@ -42,10 +44,10 @@ export class UmbSearchModalElement extends UmbLitElement {
|
||||
private _searchResults: Array<UmbSearchResultItemModel> = [];
|
||||
|
||||
@state()
|
||||
private _searchProviders: Array<SearchProvider> = [];
|
||||
private _globalSearchers: Array<GlobalSearchers> = [];
|
||||
|
||||
@state()
|
||||
_currentProvider?: SearchProvider;
|
||||
_currentGlobalSearcher?: GlobalSearchers;
|
||||
|
||||
@state()
|
||||
_loading: boolean = false;
|
||||
@@ -58,7 +60,7 @@ export class UmbSearchModalElement extends UmbLitElement {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.#observeProviders();
|
||||
this.#observeGlobalSearchers();
|
||||
}
|
||||
|
||||
override connectedCallback() {
|
||||
@@ -86,25 +88,33 @@ export class UmbSearchModalElement extends UmbLitElement {
|
||||
this.modalContext?.reject();
|
||||
};
|
||||
|
||||
#observeProviders() {
|
||||
new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'searchProvider', null, async (providers) => {
|
||||
const searchProviders: Array<SearchProvider> = [];
|
||||
#observeGlobalSearchers() {
|
||||
new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'globalSearch', null, async (controllers) => {
|
||||
const globalSearch: Array<GlobalSearchers> = [];
|
||||
|
||||
for (const provider of providers) {
|
||||
const api = await createExtensionApi<UmbSearchProvider<UmbSearchResultItemModel>>(this, provider.manifest);
|
||||
if (api) {
|
||||
searchProviders.push({
|
||||
name: provider.manifest.meta?.label || provider.manifest.name,
|
||||
api,
|
||||
alias: provider.alias,
|
||||
});
|
||||
for (const controller of controllers) {
|
||||
const globalSearchApi = await createExtensionApi<UmbGlobalSearchApi>(this, controller.manifest);
|
||||
const searchProviderApi = await createExtensionApiByAlias<UmbSearchProvider<UmbSearchResultItemModel>>(
|
||||
this,
|
||||
controller.manifest.meta?.searchProviderAlias,
|
||||
);
|
||||
|
||||
const searcher: GlobalSearchers = {
|
||||
name: controller.manifest.meta?.label || controller.manifest.name,
|
||||
api: globalSearchApi,
|
||||
searchProviderApi,
|
||||
alias: controller.alias,
|
||||
};
|
||||
|
||||
if (searchProviderApi) {
|
||||
globalSearch.push(searcher);
|
||||
}
|
||||
}
|
||||
|
||||
this._searchProviders = searchProviders;
|
||||
this._globalSearchers = globalSearch;
|
||||
|
||||
if (this._searchProviders.length > 0) {
|
||||
this._currentProvider = this._searchProviders[0];
|
||||
if (this._globalSearchers.length > 0) {
|
||||
this._currentGlobalSearcher = this._globalSearchers[0];
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -141,10 +151,10 @@ export class UmbSearchModalElement extends UmbLitElement {
|
||||
}
|
||||
}
|
||||
|
||||
#setCurrentProvider(searchProvider: SearchProvider) {
|
||||
if (this._currentProvider === searchProvider) return;
|
||||
#setCurrentSearcher(searcher: GlobalSearchers) {
|
||||
if (this._currentGlobalSearcher === searcher) return;
|
||||
|
||||
this._currentProvider = searchProvider;
|
||||
this._currentGlobalSearcher = searcher;
|
||||
|
||||
this.#focusInput();
|
||||
this._loading = true;
|
||||
@@ -153,8 +163,8 @@ export class UmbSearchModalElement extends UmbLitElement {
|
||||
}
|
||||
|
||||
async #updateSearchResults() {
|
||||
if (this._search && this._currentProvider?.api) {
|
||||
const { data } = await this._currentProvider.api.search({ query: this._search });
|
||||
if (this._search && this._currentGlobalSearcher?.searchProviderApi) {
|
||||
const { data } = await this._currentGlobalSearcher.searchProviderApi.search({ query: this._search });
|
||||
if (!data) return;
|
||||
this._searchResults = data.items;
|
||||
} else {
|
||||
@@ -325,15 +335,15 @@ export class UmbSearchModalElement extends UmbLitElement {
|
||||
return html`
|
||||
<div id="search-providers">
|
||||
${repeat(
|
||||
this._searchProviders,
|
||||
(searchProvider) => searchProvider.alias,
|
||||
(searchProvider) => html`
|
||||
this._globalSearchers,
|
||||
(searcher) => searcher.alias,
|
||||
(searcher) => html`
|
||||
<button
|
||||
class="search-provider ${this._currentProvider?.alias === searchProvider.alias ? 'active' : ''}"
|
||||
data-provider-alias=${searchProvider.alias}
|
||||
@click=${() => this.#setCurrentProvider(searchProvider)}
|
||||
class="search-provider ${this._currentGlobalSearcher?.alias === searcher.alias ? 'active' : ''}"
|
||||
data-provider-alias=${searcher.alias}
|
||||
@click=${() => this.#setCurrentSearcher(searcher)}
|
||||
@keydown=${() => ''}>
|
||||
${searchProvider.name}
|
||||
${searcher.name}
|
||||
</button>
|
||||
`,
|
||||
)}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
export * from './conditions/constants.js';
|
||||
export * from './repository/constants.js';
|
||||
export * from './search/constants.js';
|
||||
export * from './workspace/constants.js';
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
export * from './global-search/constants.js';
|
||||
export const UMB_TEMPLATE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Template';
|
||||
@@ -0,0 +1 @@
|
||||
export const UMB_TEMPLATE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Template';
|
||||
@@ -0,0 +1,23 @@
|
||||
import { UMB_TEMPLATE_SEARCH_PROVIDER_ALIAS } from '../constants.js';
|
||||
import { UMB_TEMPLATE_GLOBAL_SEARCH_ALIAS } from './constants.js';
|
||||
import { UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
|
||||
import { UMB_SETTINGS_SECTION_ALIAS } from '@umbraco-cms/backoffice/settings';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Template Global Search',
|
||||
alias: UMB_TEMPLATE_GLOBAL_SEARCH_ALIAS,
|
||||
type: 'globalSearch',
|
||||
weight: 200,
|
||||
meta: {
|
||||
label: 'Templates',
|
||||
searchProviderAlias: UMB_TEMPLATE_SEARCH_PROVIDER_ALIAS,
|
||||
},
|
||||
conditions: [
|
||||
{
|
||||
alias: UMB_SECTION_USER_PERMISSION_CONDITION_ALIAS,
|
||||
match: UMB_SETTINGS_SECTION_ALIAS,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -1,9 +1,11 @@
|
||||
import { UMB_TEMPLATE_ENTITY_TYPE } from '../entity.js';
|
||||
import { UMB_TEMPLATE_SEARCH_PROVIDER_ALIAS } from './constants.js';
|
||||
import { manifests as globalSearchManifests } from './global-search/manifests.js';
|
||||
|
||||
export const manifests: Array<UmbExtensionManifest> = [
|
||||
{
|
||||
name: 'Template Search Provider',
|
||||
alias: 'Umb.SearchProvider.Template',
|
||||
alias: UMB_TEMPLATE_SEARCH_PROVIDER_ALIAS,
|
||||
type: 'searchProvider',
|
||||
api: () => import('./template.search-provider.js'),
|
||||
weight: 100,
|
||||
@@ -17,4 +19,5 @@ export const manifests: Array<UmbExtensionManifest> = [
|
||||
type: 'searchResultItem',
|
||||
forEntityTypes: [UMB_TEMPLATE_ENTITY_TYPE],
|
||||
},
|
||||
...globalSearchManifests,
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user