diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts index a9e6fb1ecd..777bebacb6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts @@ -10,6 +10,7 @@ import { manifests as extensionManifests } from './extension-registry/manifests. import { manifests as iconRegistryManifests } from './icon-registry/manifests.js'; import { manifests as localizationManifests } from './localization/manifests.js'; import { manifests as modalManifests } from './modal/common/manifests.js'; +import { manifests as pickerModalManifests } from './picker-modal/manifests.js'; import { manifests as propertyActionManifests } from './property-action/manifests.js'; import { manifests as propertyTypeManifests } from './property-type/manifests.js'; import { manifests as recycleBinManifests } from './recycle-bin/manifests.js'; @@ -24,24 +25,25 @@ import type { ManifestTypes, UmbBackofficeManifestKind } from './extension-regis export const manifests: Array = [ ...authManifests, - ...extensionManifests, - ...iconRegistryManifests, - ...cultureManifests, - ...localizationManifests, - ...themeManifests, - ...sectionManifests, - ...treeManifests, ...collectionManifests, - ...workspaceManifests, ...contentManifests, ...contentTypeManifests, - ...propertyTypeManifests, - ...settingsManifests, - ...modalManifests, + ...cultureManifests, + ...debugManifests, ...entityActionManifests, ...entityBulkActionManifests, + ...extensionManifests, + ...iconRegistryManifests, + ...localizationManifests, + ...modalManifests, + ...pickerModalManifests, ...propertyActionManifests, - ...serverFileSystemManifests, - ...debugManifests, + ...propertyTypeManifests, ...recycleBinManifests, + ...sectionManifests, + ...serverFileSystemManifests, + ...settingsManifests, + ...themeManifests, + ...treeManifests, + ...workspaceManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/manifests.ts new file mode 100644 index 0000000000..7504bc1bc5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as searchManifests } from './search/manifests.js'; +import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [...searchManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/manifests.ts new file mode 100644 index 0000000000..2a13be78ab --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as resultItemManifests } from './result-item/manifests.js'; +import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [...resultItemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.context.token.ts new file mode 100644 index 0000000000..554e05cae7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.context.token.ts @@ -0,0 +1,6 @@ +import type { UmbDefaultPickerSearchResultItemContext } from './default-picker-search-result-item.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_PICKER_SEARCH_RESULT_ITEM_CONTEXT = new UmbContextToken( + 'UmbPickerSearchResultItemContext', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.context.ts new file mode 100644 index 0000000000..841e04017e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.context.ts @@ -0,0 +1,10 @@ +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbDefaultPickerSearchResultItemContext extends UmbContextBase { + constructor(host: UmbControllerHost) { + super(host, 'pickerSearchResultItem'); + } +} + +export { UmbDefaultPickerSearchResultItemContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.element.ts new file mode 100644 index 0000000000..0d2b199a3b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/default-picker-search-result-item.element.ts @@ -0,0 +1,79 @@ +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { customElement, html, nothing, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbPickerModalContext } from '@umbraco-cms/backoffice/picker-modal'; +import { UMB_PICKER_MODAL_CONTEXT } from '@umbraco-cms/backoffice/picker-modal'; + +const elementName = 'umb-default-picker-search-result-item'; +@customElement(elementName) +export class UmbDefaultPickerSearchResultItemElement extends UmbLitElement { + #item?: any | undefined; + @property({ type: Object }) + public get item(): UmbDocumentItemModel | undefined { + return this.#item; + } + public set item(value: any | undefined) { + this.#item = value; + this.#observeIsSelected(); + } + + @state() + _isSelected = false; + + #pickerModalContext?: UmbPickerModalContext; + + constructor() { + super(); + + this.consumeContext(UMB_PICKER_MODAL_CONTEXT, (context) => { + this.#pickerModalContext = context; + this.#observeIsSelected(); + }); + } + + #observeIsSelected() { + const selectionManager = this.#pickerModalContext?.selection; + if (!selectionManager) return; + + const unique = this.item?.unique; + if (unique === undefined) return; + + this.observe(selectionManager.selection, () => { + this._isSelected = selectionManager.isSelected(unique); + console.log(this._isSelected); + }); + } + + override render() { + const item = this.item; + if (!item) return nothing; + + return html` + this.#pickerModalContext?.selection.select(item.unique)} + @deselected=${() => this.#pickerModalContext?.selection.deselect(item.unique)} + ?selected=${this._isSelected}> + ${this.#renderIcon()} + + `; + } + + #renderIcon() { + if (!this.item?.documentType.icon) return nothing; + return html``; + } + + static override styles = [UmbTextStyles]; +} + +export { UmbDocumentPickerSearchResultItemElement as element }; + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbDocumentPickerSearchResultItemElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/manifests.ts new file mode 100644 index 0000000000..12711bdae6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/default/manifests.ts @@ -0,0 +1,15 @@ +import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'kind', + alias: 'Umb.Kind.PickerSearchResultItem.Default', + matchKind: 'default', + matchType: 'pickerSearchResultItem', + manifest: { + type: 'pickerSearchResultItem', + api: () => import('./default-picker-search-result-item.context.js'), + element: () => import('./default-picker-search-result-item.element.js'), + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/manifests.ts new file mode 100644 index 0000000000..98e3dac659 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-modal/search/result-item/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as defaultManifests } from './default/manifests.js'; +import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [...defaultManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/picker/manifests.ts index 2db7b348d4..f718ec4796 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/picker/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/picker/manifests.ts @@ -4,10 +4,9 @@ import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/back export const manifests: Array = [ { type: 'pickerSearchResultItem', + kind: 'default', alias: 'Umb.PickerSearchResultItem.Document', name: 'Document Picker Search Result Item', - element: () => import('./document-picker-search-result-item.element.js'), - api: () => import('./document-picker-search-result-item.context.js'), forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], }, ];