From 9936e5754cf2658b6d26d8f022a49ff5fbe8274c Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 12:00:00 +0100 Subject: [PATCH 01/14] Feature: Datatypepickerflow - Property Icons --- ...-picker-flow-data-type-picker-modal.element.ts | 15 ++++++++++++++- .../data-type-picker-flow-modal.element.ts | 5 ++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index 9df268dfcf..37af6d4eaa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -7,6 +7,7 @@ import { css, html, customElement, state, repeat, when } from '@umbraco-cms/back import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { UmbDataTypeItemModel } from '@umbraco-cms/backoffice/data-type'; +import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-data-type-picker-flow-data-type-picker-modal') export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBaseElement< @@ -18,6 +19,8 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas private _propertyEditorUiAlias!: string; + #propertyEditorUIs: Array = []; + connectedCallback(): void { super.connectedCallback(); @@ -26,6 +29,13 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas this._propertyEditorUiAlias = this.data.propertyEditorUiAlias; this._observeDataTypesOf(this._propertyEditorUiAlias); + + this.observe(umbExtensionsRegistry.byType('propertyEditorUi'), (propertyEditorUIs) => { + // Only include Property Editor UIs which has Property Editor Schema Alias + this.#propertyEditorUIs = propertyEditorUIs.filter( + (propertyEditorUi) => !!propertyEditorUi.meta.propertyEditorSchemaAlias, + ); + }); } private async _observeDataTypesOf(propertyEditorUiAlias: string) { @@ -86,7 +96,10 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas ? html`
  • - + ui.alias === dataType.propertyEditorUiAlias)?.meta + .icon ?? 'icon-bug'} + class="icon"> ${dataType.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index af03a97473..f1eaf70ce1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -278,7 +278,10 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< html`
  • - + ${dataType.name}
    From 9e4fb4c4ecdf007b1305fa016209c46693a869dd Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:02:07 +0100 Subject: [PATCH 02/14] set icons --- ...data-type-collection.server.data-source.ts | 9 +++++++ .../data-type-flow-input.element.ts | 2 -- .../ref-data-type/ref-data-type.element.ts | 26 +++++++++++++++++-- ...ker-flow-data-type-picker-modal.element.ts | 15 +---------- .../data-type-picker-flow-modal.element.ts | 8 ++---- .../item/data-type-item.server.data-source.ts | 12 +++++++++ .../data-type/repository/item/types.ts | 1 + 7 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts index c6dd9ce6f5..558131b3e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts @@ -5,6 +5,7 @@ import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; import type { DataTypeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; /** * A data source that fetches the data-type collection data from the server. @@ -14,6 +15,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; */ export class UmbDataTypeCollectionServerDataSource implements UmbCollectionDataSource { #host: UmbControllerHost; + #manifestPropertyEditorUis: Array = []; /** * Creates an instance of UmbDataTypeCollectionServerDataSource. @@ -22,6 +24,12 @@ export class UmbDataTypeCollectionServerDataSource implements UmbCollectionDataS */ constructor(host: UmbControllerHost) { this.#host = host; + umbExtensionsRegistry + .byType('propertyEditorUi') + .subscribe((manifestPropertyEditorUIs) => { + this.#manifestPropertyEditorUis = manifestPropertyEditorUIs; + }) + .unsubscribe(); } /** @@ -48,6 +56,7 @@ export class UmbDataTypeCollectionServerDataSource implements UmbCollectionDataS unique: item.id, name: item.name, propertyEditorUiAlias: item.editorUiAlias!, + icon: this.#manifestPropertyEditorUis.find((ui) => ui.alias === item.editorUiAlias!)?.meta.icon, }; return dataTypeDetail; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts index 2f888c4a5b..d89712a6da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts @@ -78,8 +78,6 @@ export class UmbInputDataTypeElement extends FormControlMixin(UmbLitElement) { this.#editDataTypeModal?.open({}, 'edit/' + this._ids![0]); }} standalone> - - diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 4af4380ec5..fa6f3d3fe1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -2,6 +2,8 @@ import { UmbDataTypeDetailRepository } from '../../repository/detail/data-type-d import { UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; +import { UmbIconRegistry } from '@umbraco-cms/backoffice/icon'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; /** * @element umb-ref-data-type @@ -10,8 +12,27 @@ import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; */ @customElement('umb-ref-data-type') export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { - protected fallbackIcon = - ''; + #iconRegistry = new UmbIconRegistry(); // TODO Can we access the icon registry from UmbAppElement? + //icon-circle-dotted.svg + #svg = ``; + + @state() + protected fallbackIcon = this.#svg; + + async #getIconFromRegistry() { + this.observe( + umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), + async (manifestPropertyEditorUi) => { + const icon = await this.#iconRegistry.getIcon(manifestPropertyEditorUi?.meta.icon ?? ''); + if (icon) { + this.fallbackIcon = icon; + } else { + this.fallbackIcon = this.#svg; + } + }, + ), + '_observeIcon'; + } @property({ type: String, attribute: 'data-type-id' }) public get dataTypeId(): string | undefined { @@ -30,6 +51,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { this.name = dataType.name ?? ''; this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.propertyEditorSchemaAlias = dataType.editorAlias ?? ''; + this.#getIconFromRegistry(); } }, 'dataType', diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index 37af6d4eaa..ae5a854a02 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -7,7 +7,6 @@ import { css, html, customElement, state, repeat, when } from '@umbraco-cms/back import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { UmbDataTypeItemModel } from '@umbraco-cms/backoffice/data-type'; -import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-data-type-picker-flow-data-type-picker-modal') export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBaseElement< @@ -19,8 +18,6 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas private _propertyEditorUiAlias!: string; - #propertyEditorUIs: Array = []; - connectedCallback(): void { super.connectedCallback(); @@ -29,13 +26,6 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas this._propertyEditorUiAlias = this.data.propertyEditorUiAlias; this._observeDataTypesOf(this._propertyEditorUiAlias); - - this.observe(umbExtensionsRegistry.byType('propertyEditorUi'), (propertyEditorUIs) => { - // Only include Property Editor UIs which has Property Editor Schema Alias - this.#propertyEditorUIs = propertyEditorUIs.filter( - (propertyEditorUi) => !!propertyEditorUi.meta.propertyEditorSchemaAlias, - ); - }); } private async _observeDataTypesOf(propertyEditorUiAlias: string) { @@ -96,10 +86,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas ? html`
  • - ui.alias === dataType.propertyEditorUiAlias)?.meta - .icon ?? 'icon-bug'} - class="icon"> + ${dataType.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index f1eaf70ce1..220f8a3971 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -1,4 +1,3 @@ -import { UmbDataTypeTreeRepository } from '../../tree/data-type-tree.repository.js'; import { UMB_DATATYPE_WORKSPACE_MODAL } from '../../workspace/data-type-workspace.modal-token.js'; import { UMB_DATA_TYPE_ENTITY_TYPE } from '../../entity.js'; import { UmbDataTypeCollectionRepository } from '../../collection/index.js'; @@ -275,13 +274,10 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< dataTypes, (dataType) => dataType.unique, (dataType) => - html`
  • + html`
  • - + ${dataType.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/data-type-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/data-type-item.server.data-source.ts index d2963a59c1..6e5faabc94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/data-type-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/data-type-item.server.data-source.ts @@ -3,6 +3,9 @@ import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository' import type { DataTypeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; + +let manifestPropertyEditorUis: Array = []; /** * A server data source for Data Type items @@ -19,11 +22,19 @@ export class UmbDataTypeItemServerDataSource extends UmbItemServerDataSourceBase * @param {UmbControllerHost} host * @memberof UmbDataTypeItemServerDataSource */ + constructor(host: UmbControllerHost) { super(host, { getItems, mapper, }); + + umbExtensionsRegistry + .byType('propertyEditorUi') + .subscribe((manifestPropertyEditorUIs) => { + manifestPropertyEditorUis = manifestPropertyEditorUIs; + }) + .unsubscribe(); } } @@ -35,5 +46,6 @@ const mapper = (item: DataTypeItemResponseModel): UmbDataTypeItemModel => { unique: item.id, name: item.name, propertyEditorUiAlias: item.editorUiAlias || '', // TODO: why can this be undefined or null on the server? + icon: manifestPropertyEditorUis.find((ui) => ui.alias === item.editorUiAlias)?.meta.icon, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/types.ts index d798ac80cc..185aa5cba4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/types.ts @@ -2,4 +2,5 @@ export interface UmbDataTypeItemModel { unique: string; name: string; propertyEditorUiAlias: string; + icon?: string; } From 717e9c9e8f535ca981c6f71cbc6a66e7c69cb6ad Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:09:07 +0100 Subject: [PATCH 03/14] use umb-icon --- .../data-type-picker-flow-data-type-picker-modal.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index ae5a854a02..a780536777 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -86,7 +86,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas ? html`
  • - + ${dataType.name}
    From 64ab772fb46908392b05c11a2477571f67865418 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:29:45 +0100 Subject: [PATCH 04/14] datatype tree icons --- .../tree/data-type-tree.server.data-source.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts index d4fda7664a..7f0af01905 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts @@ -4,6 +4,9 @@ import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DataTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; + +let manifestPropertyEditorUis: Array = []; /** * A data source for a data type tree that fetches data from the server @@ -26,12 +29,19 @@ export class UmbDataTypeTreeServerDataSource extends UmbTreeServerDataSourceBase getChildrenOf, mapper, }); + umbExtensionsRegistry + .byType('propertyEditorUi') + .subscribe((manifestPropertyEditorUIs) => { + manifestPropertyEditorUis = manifestPropertyEditorUIs; + }) + .unsubscribe(); } } -const getRootItems = (args: UmbTreeRootItemsRequestArgs) => +const getRootItems = async (args: UmbTreeRootItemsRequestArgs) => { // eslint-disable-next-line local-rules/no-direct-api-import - DataTypeResource.getTreeDataTypeRoot({ skip: args.skip, take: args.take }); + return DataTypeResource.getTreeDataTypeRoot({ skip: args.skip, take: args.take }); +}; const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { @@ -48,6 +58,7 @@ const mapper = (item: DataTypeTreeItemResponseModel): UmbDataTypeTreeItemModel = return { unique: item.id, parentUnique: item.parent?.id || null, + icon: manifestPropertyEditorUis.find((ui) => ui.alias === item.editorUiAlias)?.meta.icon, name: item.name, entityType: item.isFolder ? 'data-type-folder' : 'data-type', isFolder: item.isFolder, From 3d07569de8d0402d6f4e53af8ea026b1f42a575c Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:31:16 +0100 Subject: [PATCH 05/14] show icon-circle-dotted when no icon --- .../data-type-picker-flow-data-type-picker-modal.element.ts | 2 +- .../data-type-picker-flow-modal.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index a780536777..23d0012b14 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -86,7 +86,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas ? html`
  • - + ${dataType.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index 220f8a3971..d0d634e4e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -277,7 +277,7 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< html`
  • - + ${dataType.name}
    From b887379917d969e3b77592370e40c0795a4c2bee Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:56:32 +0100 Subject: [PATCH 06/14] requesticon --- .../ref-data-type/ref-data-type.element.ts | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index fa6f3d3fe1..04feb80560 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -1,8 +1,7 @@ import { UmbDataTypeDetailRepository } from '../../repository/detail/data-type-detail.repository.js'; -import { UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; +import { UUIIconRequestEvent, UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import { UmbIconRegistry } from '@umbraco-cms/backoffice/icon'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; /** @@ -12,27 +11,10 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registr */ @customElement('umb-ref-data-type') export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { - #iconRegistry = new UmbIconRegistry(); // TODO Can we access the icon registry from UmbAppElement? - //icon-circle-dotted.svg - #svg = ``; - @state() - protected fallbackIcon = this.#svg; - - async #getIconFromRegistry() { - this.observe( - umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), - async (manifestPropertyEditorUi) => { - const icon = await this.#iconRegistry.getIcon(manifestPropertyEditorUi?.meta.icon ?? ''); - if (icon) { - this.fallbackIcon = icon; - } else { - this.fallbackIcon = this.#svg; - } - }, - ), - '_observeIcon'; - } + protected fallbackIcon = + ``; + //icon-circle-dotted.svg @property({ type: String, attribute: 'data-type-id' }) public get dataTypeId(): string | undefined { @@ -75,6 +57,33 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { @state() propertyEditorSchemaAlias = ''; + async #getIconFromRegistry() { + this.observe( + umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), + async (manifestPropertyEditorUi) => { + const icon = manifestPropertyEditorUi?.meta.icon; + if (icon) { + this.#requestIcon(icon); + } + }, + ), + '_observeIcon'; + } + + #requestIcon(iconName: string) { + if (iconName !== '' && iconName !== null) { + const event = new UUIIconRequestEvent(UUIIconRequestEvent.ICON_REQUEST, { + detail: { iconName: iconName }, + }); + this.dispatchEvent(event); + if (event.icon !== null) { + event.icon.then((iconSvg: string) => { + this.fallbackIcon = iconSvg; + }); + } + } + } + protected renderDetail() { const details: string[] = []; From aea14a5b17dc22dcfbac24536e0c3e963eb8d040 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:27:33 +0100 Subject: [PATCH 07/14] if ui alias --- .../components/ref-data-type/ref-data-type.element.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 04feb80560..faa90c4ad8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -33,7 +33,9 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { this.name = dataType.name ?? ''; this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.propertyEditorSchemaAlias = dataType.editorAlias ?? ''; - this.#getIconFromRegistry(); + if (this.propertyEditorUiAlias) { + this.#getIconFromRegistry(); + } } }, 'dataType', From ece9194e86d702ff58e34f9ccd21634d8a1debb8 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:42:54 +0100 Subject: [PATCH 08/14] explanation --- .../components/ref-data-type/ref-data-type.element.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index faa90c4ad8..2b1277ca45 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -64,15 +64,18 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), async (manifestPropertyEditorUi) => { const icon = manifestPropertyEditorUi?.meta.icon; + /** [LI] We have the icon name now, but because this element extends from uui-ref-node, it wants the icon via the icon slot. + * From what I can see, this is not possible via this file, but this is the file that have the datatype data.... + * Instead, overwriting the fallback icon which requires a SVG... */ if (icon) { - this.#requestIcon(icon); + this.#requestIconSVG(icon); } }, ), '_observeIcon'; } - #requestIcon(iconName: string) { + #requestIconSVG(iconName: string) { if (iconName !== '' && iconName !== null) { const event = new UUIIconRequestEvent(UUIIconRequestEvent.ICON_REQUEST, { detail: { iconName: iconName }, From 0c5fc57d57535898940ec38d904848d2b0d7ac21 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:43:41 +0100 Subject: [PATCH 09/14] typo --- .../data-type/components/ref-data-type/ref-data-type.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 2b1277ca45..8cf43506e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -66,7 +66,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { const icon = manifestPropertyEditorUi?.meta.icon; /** [LI] We have the icon name now, but because this element extends from uui-ref-node, it wants the icon via the icon slot. * From what I can see, this is not possible via this file, but this is the file that have the datatype data.... - * Instead, overwriting the fallback icon which requires a SVG... */ + * Instead, overwriting the fallbackIcon property which requires a SVG... */ if (icon) { this.#requestIconSVG(icon); } From 8dd45abf3b1461aae377474d7ea1713075b3a9ee Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:44:50 +0100 Subject: [PATCH 10/14] rename method --- .../components/ref-data-type/ref-data-type.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 8cf43506e1..4b8e4a3d80 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -34,7 +34,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.propertyEditorSchemaAlias = dataType.editorAlias ?? ''; if (this.propertyEditorUiAlias) { - this.#getIconFromRegistry(); + this.#getIconFromUiAlias(); } } }, @@ -59,7 +59,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { @state() propertyEditorSchemaAlias = ''; - async #getIconFromRegistry() { + async #getIconFromUiAlias() { this.observe( umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), async (manifestPropertyEditorUi) => { From f80c6ca312674352fbf0ef93bb39e00b53945d3e Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:09:19 +0100 Subject: [PATCH 11/14] only check icon when ui alias change --- .../components/ref-data-type/ref-data-type.element.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 4b8e4a3d80..e144ad4b2e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -31,9 +31,9 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { (dataType) => { if (dataType) { this.name = dataType.name ?? ''; - this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.propertyEditorSchemaAlias = dataType.editorAlias ?? ''; - if (this.propertyEditorUiAlias) { + if (dataType.editorUiAlias ?? '' !== this.propertyEditorUiAlias) { + this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.#getIconFromUiAlias(); } } @@ -60,6 +60,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { propertyEditorSchemaAlias = ''; async #getIconFromUiAlias() { + if (!this.propertyEditorUiAlias) return; this.observe( umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), async (manifestPropertyEditorUi) => { From cbe15124ce606c09a3a4c97eb519512f371df39c Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:28:25 +0100 Subject: [PATCH 12/14] add flex to umb-icon --- .../src/packages/core/components/icon/icon.element.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/icon/icon.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/icon/icon.element.ts index 7608213899..550fde3d81 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/icon/icon.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/icon/icon.element.ts @@ -49,7 +49,9 @@ export class UmbIconElement extends UmbLitElement { UmbTextStyles, css` :host { - display: contents; + display: flex; + justify-content: center; + align-items: center; } `, ]; From 60fe9c64af160ad045fb315b6302c16edc8b6ee8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 23 Mar 2024 20:11:58 +0100 Subject: [PATCH 13/14] add advanced settings menu --- .../extension-registry/menu-item/manifests.ts | 8 +++--- .../extension-root-workspace.element.ts | 5 +++- .../src/packages/core/settings/manifests.ts | 27 ++++++++++++++++++- .../log-viewer/menu-item/manifests.ts | 4 +-- .../relation-types/menu-item/manifests.ts | 4 +-- .../src/packages/templating/menu.manifests.ts | 2 +- 6 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/menu-item/manifests.ts index 300913745e..6604cf0ea2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/menu-item/manifests.ts @@ -3,13 +3,13 @@ import type { ManifestMenuItem } from '@umbraco-cms/backoffice/extension-registr const menuItem: ManifestMenuItem = { type: 'menuItem', alias: 'Umb.MenuItem.Extensions', - name: 'Extensions Menu Item', - weight: 0, + name: 'Extension Insights Menu Item', + weight: 200, meta: { - label: 'Extensions', + label: 'Extension Insights', icon: 'icon-wand', entityType: 'extension-root', - menus: ['Umb.Menu.Settings'], + menus: ['Umb.Menu.AdvancedSettings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/workspace/extension-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/workspace/extension-root-workspace.element.ts index 198f495da2..9c701cf6e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/workspace/extension-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/workspace/extension-root-workspace.element.ts @@ -7,7 +7,10 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; export class UmbExtensionRootWorkspaceElement extends UmbLitElement { render() { return html` - + `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts index 0f84871955..e59669bf01 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts @@ -32,7 +32,7 @@ export const manifests = [ kind: 'menu', alias: 'Umb.SectionSidebarMenu.Settings', name: 'Settings Section Sidebar Menu', - weight: 200, + weight: 300, meta: { label: 'Settings', menu: 'Umb.Menu.Settings', @@ -44,5 +44,30 @@ export const manifests = [ }, ], }, + { + type: 'menu', + alias: 'Umb.Menu.AdvancedSettings', + name: 'Advanced Settings Menu', + meta: { + label: 'Advanced', + }, + }, + { + type: 'sectionSidebarApp', + kind: 'menu', + alias: 'Umb.SectionSidebarMenu.AdvancedSettings', + name: 'Advanced Settings Section Sidebar Menu', + weight: 100, + meta: { + label: 'Advanced', + menu: 'Umb.Menu.AdvancedSettings', + }, + conditions: [ + { + alias: 'Umb.Condition.SectionAlias', + match: UMB_SETTINGS_SECTION_ALIAS, + }, + ], + }, ...welcomeDashboardManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/menu-item/manifests.ts index 90e1fb7c0b..34a5fff422 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/menu-item/manifests.ts @@ -3,13 +3,13 @@ import type { ManifestMenuItem } from '@umbraco-cms/backoffice/extension-registr const menuItem: ManifestMenuItem = { type: 'menuItem', alias: 'Umb.MenuItem.LogViewer', - name: 'LogViewer Menu Item', + name: 'Log Viewer Menu Item', weight: 300, meta: { label: 'Log Viewer', icon: 'icon-box-alt', entityType: 'logviewer', - menus: ['Umb.Menu.Settings'], + menus: ['Umb.Menu.AdvancedSettings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts index ef111632a2..297b8c6f93 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts @@ -6,11 +6,11 @@ const menuItem: ManifestTypes = { kind: 'tree', alias: 'Umb.MenuItem.RelationTypes', name: 'Relation Types Menu Item', - weight: 500, + weight: 100, meta: { treeAlias: UMB_RELATION_TYPE_TREE_ALIAS, label: 'Relation Types', - menus: ['Umb.Menu.Settings'], + menus: ['Umb.Menu.AdvancedSettings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts index 0b1437c2b5..71bd6eb3ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts @@ -16,7 +16,7 @@ const menuSectionSidebarApp: ManifestTypes = { kind: 'menu', alias: 'Umb.SectionSidebarMenu.Templating', name: 'Templating Section Sidebar Menu', - weight: 100, + weight: 200, meta: { label: 'Templating', menu: 'Umb.Menu.Templating', From 7c62663d146e5921c7fc246d52308f256f5a7fc3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 23 Mar 2024 20:16:28 +0100 Subject: [PATCH 14/14] remove unused label from manifest --- .../src/packages/core/settings/manifests.ts | 6 ------ .../src/packages/dictionary/menu/manifests.ts | 3 --- .../src/packages/documents/documents/menu.manifests.ts | 3 --- .../src/packages/media/media/menu.manifests.ts | 3 --- .../src/packages/media/menu.manifests.ts | 3 --- .../src/packages/templating/menu.manifests.ts | 3 --- 6 files changed, 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts index e59669bf01..a87b8da871 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts @@ -23,9 +23,6 @@ export const manifests = [ type: 'menu', alias: 'Umb.Menu.Settings', name: 'Settings Menu', - meta: { - label: 'Settings', - }, }, { type: 'sectionSidebarApp', @@ -48,9 +45,6 @@ export const manifests = [ type: 'menu', alias: 'Umb.Menu.AdvancedSettings', name: 'Advanced Settings Menu', - meta: { - label: 'Advanced', - }, }, { type: 'sectionSidebarApp', diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/menu/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/menu/manifests.ts index bd909ef43c..f11c647652 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/menu/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/menu/manifests.ts @@ -8,9 +8,6 @@ const menu: ManifestMenu = { type: 'menu', alias: UMB_DICTIONARY_MENU_ALIAS, name: 'Dictionary Menu', - meta: { - label: 'Dictionary', - }, }; const menuItem: ManifestMenuItemTreeKind = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/menu.manifests.ts index 6bb7fe2726..72a75a52bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/menu.manifests.ts @@ -6,9 +6,6 @@ const menu: ManifestMenu = { type: 'menu', alias: UMB_CONTENT_MENU_ALIAS, name: 'Content Menu', - meta: { - label: 'Content', - }, }; export const manifests = [menu]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/menu.manifests.ts index 7f7f2a0444..b10c33a8be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/menu.manifests.ts @@ -6,9 +6,6 @@ const menu: ManifestMenu = { type: 'menu', alias: UMB_MEDIA_MENU_ALIAS, name: 'Media Menu', - meta: { - label: 'Media', - }, }; export const manifests = [menu]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/menu.manifests.ts index cdefc905ff..a807f482be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/menu.manifests.ts @@ -4,9 +4,6 @@ const menu: ManifestMenu = { type: 'menu', alias: 'Umb.Menu.Media', name: 'Media Menu', - meta: { - label: 'Media', - }, }; export const manifests = [menu]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts index 71bd6eb3ee..a353119dea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts @@ -6,9 +6,6 @@ const menu: ManifestMenu = { type: 'menu', alias: 'Umb.Menu.Templating', name: 'Templating Menu', - meta: { - label: 'Templating', - }, }; const menuSectionSidebarApp: ManifestTypes = {