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:
Mads Rasmussen
2025-05-19 10:50:12 +02:00
committed by GitHub
parent e959850a66
commit 1fdeb4f251
44 changed files with 325 additions and 36 deletions

View File

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

View File

@@ -0,0 +1,2 @@
export * from './global-search/constants.js';
export const UMB_DATA_TYPE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.DataType';

View File

@@ -0,0 +1 @@
export const UMB_DATA_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.DataType';

View File

@@ -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,
},
],
},
];

View File

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

View File

@@ -1 +1,2 @@
export * from './global-search/constants.js';
export const UMB_DICTIONARY_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Dictionary';

View File

@@ -0,0 +1 @@
export const UMB_DICTIONARY_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Dictionary';

View File

@@ -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,
},
],
},
];

View File

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

View File

@@ -1 +1,2 @@
export * from './global-search/constants.js';
export const UMB_DOCUMENT_TYPE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.DocumentType';

View File

@@ -0,0 +1 @@
export const UMB_DOCUMENT_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.DocumentType';

View File

@@ -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,
},
],
},
];

View File

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

View File

@@ -1 +1,2 @@
export * from './global-search/constants.js';
export const UMB_DOCUMENT_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Document';

View File

@@ -0,0 +1 @@
export const UMB_DOCUMENT_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Document';

View File

@@ -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,
},
],
},
];

View File

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

View File

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

View File

@@ -0,0 +1,2 @@
export * from './global-search/constants.js';
export const UMB_MEDIA_TYPE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.MediaType';

View File

@@ -0,0 +1 @@
export const UMB_MEDIA_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.MediaType';

View File

@@ -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,
},
],
},
];

View File

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

View File

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

View File

@@ -1 +1,2 @@
export * from './global-search/constants.js';
export const UMB_MEDIA_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Media';

View File

@@ -0,0 +1 @@
export const UMB_MEDIA_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Media';

View File

@@ -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,
},
],
},
];

View File

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

View File

@@ -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';

View File

@@ -0,0 +1,2 @@
export * from './global-search/constants.js';
export const UMB_MEMBER_TYPE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.MemberType';

View File

@@ -0,0 +1 @@
export const UMB_MEMBER_TYPE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.MemberType';

View File

@@ -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,
},
],
},
];

View File

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

View File

@@ -1 +1,2 @@
export * from './global-search/constants.js';
export const UMB_MEMBER_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Member';

View File

@@ -0,0 +1 @@
export const UMB_MEMBER_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Member';

View File

@@ -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,
},
],
},
];

View File

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

View File

@@ -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;
}
}

View File

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

View File

@@ -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>
`,
)}

View File

@@ -1,3 +1,4 @@
export * from './conditions/constants.js';
export * from './repository/constants.js';
export * from './search/constants.js';
export * from './workspace/constants.js';

View File

@@ -0,0 +1,2 @@
export * from './global-search/constants.js';
export const UMB_TEMPLATE_SEARCH_PROVIDER_ALIAS = 'Umb.SearchProvider.Template';

View File

@@ -0,0 +1 @@
export const UMB_TEMPLATE_GLOBAL_SEARCH_ALIAS = 'Umb.GlobalSearch.Template';

View File

@@ -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,
},
],
},
];

View File

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