From 63103754d9ed91390d810d707be3a2271ef17710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 11:34:06 +0100 Subject: [PATCH 01/13] rename to gotEditor --- .../components/entity-property/entity-property.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts index 2b582722ec..6637e7b3a0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts @@ -137,12 +137,12 @@ export class UmbEntityPropertyElement extends UmbLitElement { this.propertyEditorUIObserver?.destroy(); this.propertyEditorUIObserver = new UmbObserverController(this, umbExtensionsRegistry.getByAlias(this.propertyEditorUIAlias), (manifest) => { if (manifest?.type === 'propertyEditorUI') { - this._gotData(manifest); + this._gotEditor(manifest); } }); } - private _gotData(propertyEditorUIManifest?: ManifestPropertyEditorUI) { + private _gotEditor(propertyEditorUIManifest?: ManifestPropertyEditorUI) { if (!propertyEditorUIManifest) { // TODO: if dataTypeKey didn't exist in store, we should do some nice UI. return; From 8a5f0201ebc6221e47137103b32a6ec8f0a7d2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 11:35:12 +0100 Subject: [PATCH 02/13] use class method --- .../components/entity-property/entity-property.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts index 6637e7b3a0..e5bf622351 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts @@ -135,7 +135,7 @@ export class UmbEntityPropertyElement extends UmbLitElement { private _observePropertyEditorUI() { this.propertyEditorUIObserver?.destroy(); - this.propertyEditorUIObserver = new UmbObserverController(this, umbExtensionsRegistry.getByAlias(this.propertyEditorUIAlias), (manifest) => { + this.propertyEditorUIObserver = this.observe(umbExtensionsRegistry.getByAlias(this.propertyEditorUIAlias), (manifest) => { if (manifest?.type === 'propertyEditorUI') { this._gotEditor(manifest); } From 9bad58dc66bf344767691f12c49d70d44c1eb501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 12:00:51 +0100 Subject: [PATCH 03/13] smarter types --- .../src/core/extensions-registry/models.ts | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts index 66614007be..ce9897c54f 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts @@ -59,27 +59,12 @@ export type ManifestTypes = | ManifestCollectionBulkAction | ManifestCollectionView; -export type ManifestStandardTypes = - | 'headerApp' - | 'section' - | 'sectionView' - | 'tree' - | 'workspace' - | 'workspaceAction' - | 'workspaceView' - | 'workspaceViewCollection' - | 'treeItemAction' - | 'propertyEditorUI' - | 'propertyEditorModel' - | 'dashboard' - | 'dashboardCollection' - | 'userDashboard' - | 'propertyAction' - | 'packageView' - | 'entrypoint' - | 'externalLoginProvider' - | 'collectionBulkAction' - | 'collectionView'; + +export type ManifestStandardTypes = ManifestTypes['type']; + +export type AliasManifestTypeMap = { + [Manifest in ManifestTypes as Manifest['type']]: Manifest; +}; export type ManifestElementType = | ManifestSection @@ -98,6 +83,8 @@ export type ManifestElementType = | ManifestCollectionBulkAction | ManifestCollectionView; + + export interface ManifestBase { type: string; alias: string; From 9858fb5b93a5a6c37245b93916440b10abeccdcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 12:01:03 +0100 Subject: [PATCH 04/13] getByTypeAndAlias --- .../components/entity-property/entity-property.element.ts | 4 ++-- .../core/extensions-api/registry/extension.registry.ts | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts index e5bf622351..8f58f11ba6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts @@ -135,8 +135,8 @@ export class UmbEntityPropertyElement extends UmbLitElement { private _observePropertyEditorUI() { this.propertyEditorUIObserver?.destroy(); - this.propertyEditorUIObserver = this.observe(umbExtensionsRegistry.getByAlias(this.propertyEditorUIAlias), (manifest) => { - if (manifest?.type === 'propertyEditorUI') { + this.propertyEditorUIObserver = this.observe(umbExtensionsRegistry.getByTypeAndAlias('propertyEditorUI', this.propertyEditorUIAlias), (manifest) => { + if(manifest) { this._gotEditor(manifest); } }); diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts index a7fa6e245a..8ebdbdafe5 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts @@ -70,9 +70,13 @@ export class UmbExtensionRegistry { } - getByAlias(alias: string): Observable { + getByAlias(alias: string) { // TODO: make pipes prettier/simpler/reuseable - return this.extensions.pipe(map((dataTypes) => dataTypes.find((extension) => extension.alias === alias) || null)) as Observable; + return this.extensions.pipe(map((dataTypes) => dataTypes.find((extension) => extension.alias === alias) || null)); + } + + getByTypeAndAlias(type: string, alias: string) { + return this.extensionsOfType(type).pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null)); } // TODO: implement unregister of extension From de49e10f7a6cdbef1c112e278f83044824f38be3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 12:10:07 +0100 Subject: [PATCH 05/13] implement AliasManifestTypeMap --- .../src/core/extensions-api/registry/extension.registry.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts index 8ebdbdafe5..2d8e124baf 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts @@ -19,6 +19,7 @@ import type { ManifestHeaderApp, ManifestCollectionView, ManifestCollectionBulkAction, + AliasManifestTypeMap, } from '../../models'; import { hasDefaultExport } from '../has-default-export.function'; import { loadExtension } from '../load-extension.function'; @@ -75,8 +76,8 @@ export class UmbExtensionRegistry { return this.extensions.pipe(map((dataTypes) => dataTypes.find((extension) => extension.alias === alias) || null)); } - getByTypeAndAlias(type: string, alias: string) { - return this.extensionsOfType(type).pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null)); + getByTypeAndAlias(type: Key, alias: string) { + return this.extensionsOfType(type).pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null)); } // TODO: implement unregister of extension From 6d820c0ef7a572831c24033836f2335831e395bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 13:01:33 +0100 Subject: [PATCH 06/13] correct manifest types --- .../workspace-view-data-type-edit.element.ts | 6 ++--- .../extension-root-workspace.element.ts | 4 +-- .../property-editor-config.element.ts | 26 ++++++++----------- .../registry/extension.registry.ts | 7 ++--- .../src/core/extensions-registry/models.ts | 1 - 5 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/workspace-view-data-type-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/workspace-view-data-type-edit.element.ts index aeecef13fa..d0485a8d37 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/workspace-view-data-type-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/workspace-view-data-type-edit.element.ts @@ -79,12 +79,12 @@ export class UmbWorkspaceViewDataTypeEditElement extends UmbLitElement { if (!propertyEditorUIAlias) return; this.observe( - umbExtensionsRegistry.getByAlias(propertyEditorUIAlias), + umbExtensionsRegistry.getByTypeAndAlias('propertyEditorUI', propertyEditorUIAlias), (propertyEditorUI) => { this._propertyEditorUIName = propertyEditorUI?.meta.label ?? propertyEditorUI?.name ?? ''; this._propertyEditorUIAlias = propertyEditorUI?.alias ?? ''; - this._propertyEditorUIIcon = propertyEditorUI?.meta?.icon ?? ''; - this._propertyEditorModelAlias = propertyEditorUI?.meta?.propertyEditorModel ?? ''; + this._propertyEditorUIIcon = propertyEditorUI?.meta.icon ?? ''; + this._propertyEditorModelAlias = propertyEditorUI?.meta.propertyEditorModel ?? ''; this._workspaceContext?.update({ propertyEditorModelAlias: this._propertyEditorModelAlias }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts index f0f0eb1a86..557c5f01e3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts @@ -2,13 +2,13 @@ import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { isManifestElementNameType } from '@umbraco-cms/extensions-api'; import { umbExtensionsRegistry } from '@umbraco-cms/extensions-registry'; -import type { ManifestTypes } from '@umbraco-cms/models'; +import type { ManifestBase } from '@umbraco-cms/models'; import { UmbLitElement } from '@umbraco-cms/element'; @customElement('umb-extension-root-workspace') export class UmbExtensionRootWorkspaceElement extends UmbLitElement { @state() - private _extensions?: Array = undefined; + private _extensions?: Array = undefined; connectedCallback(): void { super.connectedCallback(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/shared/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/shared/property-editor-config/property-editor-config.element.ts index 4e3f96478a..f6dc453062 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/shared/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/shared/property-editor-config/property-editor-config.element.ts @@ -58,27 +58,23 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { private _observePropertyEditorUIConfig() { if (!this._propertyEditorUIAlias) return; - this.observe(umbExtensionsRegistry.getByAlias(this.propertyEditorUIAlias), (manifest) => { - if (manifest?.type === 'propertyEditorUI') { - this._observePropertyEditorModelConfig(manifest.meta.propertyEditorModel); - this._propertyEditorUIConfigProperties = manifest?.meta.config?.properties || []; - this._propertyEditorUIConfigDefaultData = manifest?.meta.config?.defaultData || []; - this._mergeConfigProperties(); - this._mergeConfigDefaultData(); - } + this.observe(umbExtensionsRegistry.getByTypeAndAlias('propertyEditorUI', this.propertyEditorUIAlias), (manifest) => { + this._observePropertyEditorModelConfig(manifest?.meta.propertyEditorModel); + this._propertyEditorUIConfigProperties = manifest?.meta.config?.properties || []; + this._propertyEditorUIConfigDefaultData = manifest?.meta.config?.defaultData || []; + this._mergeConfigProperties(); + this._mergeConfigDefaultData(); }); } private _observePropertyEditorModelConfig(propertyEditorModelAlias?: string) { if (!propertyEditorModelAlias) return; - this.observe(umbExtensionsRegistry.getByAlias(propertyEditorModelAlias), (manifest) => { - if (manifest?.type === 'propertyEditorModel') { - this._propertyEditorModelConfigProperties = manifest?.meta.config?.properties || []; - this._propertyEditorModelConfigDefaultData = manifest?.meta.config?.defaultData || []; - this._mergeConfigProperties(); - this._mergeConfigDefaultData(); - } + this.observe(umbExtensionsRegistry.getByTypeAndAlias('propertyEditorModel', propertyEditorModelAlias), (manifest) => { + this._propertyEditorModelConfigProperties = manifest?.meta.config?.properties || []; + this._propertyEditorModelConfigDefaultData = manifest?.meta.config?.defaultData || []; + this._mergeConfigProperties(); + this._mergeConfigDefaultData(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts index 2d8e124baf..740672c2ee 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts @@ -20,12 +20,13 @@ import type { ManifestCollectionView, ManifestCollectionBulkAction, AliasManifestTypeMap, + ManifestBase, } from '../../models'; import { hasDefaultExport } from '../has-default-export.function'; import { loadExtension } from '../load-extension.function'; export class UmbExtensionRegistry { - private _extensions = new BehaviorSubject>([]); + private _extensions = new BehaviorSubject>([]); public readonly extensions = this._extensions.asObservable(); register(manifest: ManifestTypes & { loader?: () => Promise }): void { @@ -103,13 +104,13 @@ export class UmbExtensionRegistry { extensionsOfType(type: 'collectionView'): Observable>; extensionsOfType(type: 'collectionBulkAction'): Observable>; extensionsOfType(type: string): Observable>; - extensionsOfType(type: string): Observable> { + extensionsOfType(type: string): Observable> { return this.extensions.pipe( map((exts) => exts.filter((ext) => ext.type === type).sort((a, b) => (b.weight || 0) - (a.weight || 0))) ); } - extensionsOfTypes(types: string[]): Observable> { + extensionsOfTypes(types: string[]): Observable> { return this.extensions.pipe( map((exts) => exts.filter((ext) => (types.indexOf(ext.type) !== -1)).sort((a, b) => (b.weight || 0) - (a.weight || 0))) ) as Observable>; diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts index ce9897c54f..a2be13df45 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts @@ -59,7 +59,6 @@ export type ManifestTypes = | ManifestCollectionBulkAction | ManifestCollectionView; - export type ManifestStandardTypes = ManifestTypes['type']; export type AliasManifestTypeMap = { From 46950cea1cf20aab6dee34be349c2ffab018f148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 13:15:49 +0100 Subject: [PATCH 07/13] extensionsOfType using AliasManifestTypeMap --- .../registry/extension.registry.ts | 32 ++++--------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts index 740672c2ee..c4cdc54ee4 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts @@ -25,6 +25,8 @@ import type { import { hasDefaultExport } from '../has-default-export.function'; import { loadExtension } from '../load-extension.function'; +type SpecificManifestTypeOrManifestBase = T extends keyof AliasManifestTypeMap ? AliasManifestTypeMap[T] : ManifestBase; + export class UmbExtensionRegistry { private _extensions = new BehaviorSubject>([]); public readonly extensions = this._extensions.asObservable(); @@ -78,36 +80,16 @@ export class UmbExtensionRegistry { } getByTypeAndAlias(type: Key, alias: string) { - return this.extensionsOfType(type).pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null)); + return this.extensionsOfType(type).pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null)); } // TODO: implement unregister of extension - // Typings concept, need to put all core types to get a good array return type for the provided type... - extensionsOfType(type: 'headerApp'): Observable>; - extensionsOfType(type: 'section'): Observable>; - extensionsOfType(type: 'sectionView'): Observable>; - extensionsOfType(type: 'tree'): Observable>; - extensionsOfType(type: 'workspace'): Observable>; - extensionsOfType(type: 'treeItemAction'): Observable>; - extensionsOfType(type: 'dashboard'): Observable>; - extensionsOfType(type: 'dashboardCollection'): Observable>; - extensionsOfType(type: 'workspaceView'): Observable>; - extensionsOfType(type: 'workspaceAction'): Observable>; - extensionsOfType(type: 'propertyEditorUI'): Observable>; - extensionsOfType(type: 'propertyEditorModel'): Observable>; - extensionsOfType(type: 'propertyAction'): Observable>; - extensionsOfType(type: 'packageView'): Observable>; - extensionsOfType(type: 'entrypoint'): Observable>; - extensionsOfType(type: 'custom'): Observable>; - extensionsOfType(type: 'externalLoginProvider'): Observable>; - extensionsOfType(type: 'collectionView'): Observable>; - extensionsOfType(type: 'collectionBulkAction'): Observable>; - extensionsOfType(type: string): Observable>; - extensionsOfType(type: string): Observable> { + + extensionsOfType>(type: Key) { return this.extensions.pipe( map((exts) => exts.filter((ext) => ext.type === type).sort((a, b) => (b.weight || 0) - (a.weight || 0))) - ); + ) as Observable>; } extensionsOfTypes(types: string[]): Observable> { @@ -115,4 +97,4 @@ export class UmbExtensionRegistry { map((exts) => exts.filter((ext) => (types.indexOf(ext.type) !== -1)).sort((a, b) => (b.weight || 0) - (a.weight || 0))) ) as Observable>; } -} +} \ No newline at end of file From e3cf1bd30127f992489be2c9510dd5e3981f7727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 13:16:06 +0100 Subject: [PATCH 08/13] clean up imports --- .../registry/extension.registry.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts index c4cdc54ee4..e2ae3cf3a7 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts @@ -1,24 +1,6 @@ import { BehaviorSubject, map, Observable } from 'rxjs'; import type { ManifestTypes, - ManifestDashboard, - ManifestWorkspaceView, - ManifestEntrypoint, - ManifestPropertyAction, - ManifestPropertyEditorUI, - ManifestPropertyEditorModel, - ManifestSection, - ManifestSectionView, - ManifestTree, - ManifestTreeItemAction, - ManifestWorkspace, - ManifestWorkspaceAction, - ManifestCustom, - ManifestPackageView, - ManifestExternalLoginProvider, - ManifestHeaderApp, - ManifestCollectionView, - ManifestCollectionBulkAction, AliasManifestTypeMap, ManifestBase, } from '../../models'; From 1ed815f16ba4d3d0f1495f9943c50f6f67d09591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 13:17:56 +0100 Subject: [PATCH 09/13] ability to remove a editor UI. --- .../components/entity-property/entity-property.element.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts index 8f58f11ba6..5817a831d4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-property/entity-property.element.ts @@ -136,13 +136,11 @@ export class UmbEntityPropertyElement extends UmbLitElement { private _observePropertyEditorUI() { this.propertyEditorUIObserver?.destroy(); this.propertyEditorUIObserver = this.observe(umbExtensionsRegistry.getByTypeAndAlias('propertyEditorUI', this.propertyEditorUIAlias), (manifest) => { - if(manifest) { - this._gotEditor(manifest); - } + this._gotEditor(manifest); }); } - private _gotEditor(propertyEditorUIManifest?: ManifestPropertyEditorUI) { + private _gotEditor(propertyEditorUIManifest?: ManifestPropertyEditorUI | null) { if (!propertyEditorUIManifest) { // TODO: if dataTypeKey didn't exist in store, we should do some nice UI. return; From 8914f57c485da2be121c27060d170f54615e8966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 13:21:14 +0100 Subject: [PATCH 10/13] remove import --- .../src/core/extensions-api/registry/extension.registry.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts index e2ae3cf3a7..1d6dd6a78a 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts @@ -3,6 +3,7 @@ import type { ManifestTypes, AliasManifestTypeMap, ManifestBase, + ManifestCustom, } from '../../models'; import { hasDefaultExport } from '../has-default-export.function'; import { loadExtension } from '../load-extension.function'; From 25186a62447ecf44352791528cccf1693ca3435e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 13:22:14 +0100 Subject: [PATCH 11/13] rename to ManifestTypeMap --- .../core/extensions-api/registry/extension.registry.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts index 1d6dd6a78a..919148f0c1 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts @@ -1,14 +1,14 @@ import { BehaviorSubject, map, Observable } from 'rxjs'; import type { ManifestTypes, - AliasManifestTypeMap, + AliasManifestTypeMap as ManifestTypeMap, ManifestBase, ManifestCustom, } from '../../models'; import { hasDefaultExport } from '../has-default-export.function'; import { loadExtension } from '../load-extension.function'; -type SpecificManifestTypeOrManifestBase = T extends keyof AliasManifestTypeMap ? AliasManifestTypeMap[T] : ManifestBase; +type SpecificManifestTypeOrManifestBase = T extends keyof ManifestTypeMap ? ManifestTypeMap[T] : ManifestBase; export class UmbExtensionRegistry { private _extensions = new BehaviorSubject>([]); @@ -62,14 +62,14 @@ export class UmbExtensionRegistry { return this.extensions.pipe(map((dataTypes) => dataTypes.find((extension) => extension.alias === alias) || null)); } - getByTypeAndAlias(type: Key, alias: string) { + getByTypeAndAlias(type: Key, alias: string) { return this.extensionsOfType(type).pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null)); } // TODO: implement unregister of extension - extensionsOfType>(type: Key) { + extensionsOfType>(type: Key) { return this.extensions.pipe( map((exts) => exts.filter((ext) => ext.type === type).sort((a, b) => (b.weight || 0) - (a.weight || 0))) ) as Observable>; From f2407c26cd0411512675f6e022c225682a383d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 13:22:37 +0100 Subject: [PATCH 12/13] rename to ManifestTypeMap --- .../src/core/extensions-api/registry/extension.registry.ts | 5 ++--- .../src/core/extensions-registry/models.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts index 919148f0c1..2120de9e15 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/registry/extension.registry.ts @@ -1,9 +1,8 @@ import { BehaviorSubject, map, Observable } from 'rxjs'; import type { ManifestTypes, - AliasManifestTypeMap as ManifestTypeMap, - ManifestBase, - ManifestCustom, + ManifestTypeMap, + ManifestBase } from '../../models'; import { hasDefaultExport } from '../has-default-export.function'; import { loadExtension } from '../load-extension.function'; diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts index a2be13df45..fa6723f387 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts @@ -61,7 +61,7 @@ export type ManifestTypes = export type ManifestStandardTypes = ManifestTypes['type']; -export type AliasManifestTypeMap = { +export type ManifestTypeMap = { [Manifest in ManifestTypes as Manifest['type']]: Manifest; }; From 4705028ddd1b0b2ad3a971c2ee8579ebe58e001a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 5 Jan 2023 13:53:12 +0100 Subject: [PATCH 13/13] remove ManifestElementTypes use ManifestElement --- .../workspace-view-data-type-edit.element.ts | 3 +-- .../extension-slot/extension-slot.element.ts | 6 +++--- .../create-extension-element.function.ts | 4 ++-- .../is-manifest-element-name-type.function.ts | 4 ++-- .../is-manifest-elementable-type.function.ts | 4 ++-- .../is-manifest-js-type.function.ts | 4 ++-- .../is-manifest-loader-type.function.ts | 4 ++-- .../extensions-api/load-extension.function.ts | 8 ++++---- .../src/core/extensions-registry/models.ts | 19 +------------------ 9 files changed, 19 insertions(+), 37 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/workspace-view-data-type-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/workspace-view-data-type-edit.element.ts index d0485a8d37..bcc2f02ab2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/workspace-view-data-type-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/workspace-view-data-type-edit.element.ts @@ -3,8 +3,7 @@ import { css, html, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbModalService } from '../../../../../../core/modal'; import { UmbWorkspaceDataTypeContext } from '../../workspace-data-type.context'; -import { UmbDataTypeStoreItemType } from '../../../data-type.store'; -import type { DataTypeDetails, ManifestPropertyEditorUI } from '@umbraco-cms/models'; +import type { DataTypeDetails } from '@umbraco-cms/models'; import { umbExtensionsRegistry } from '@umbraco-cms/extensions-registry'; import '../../../../../shared/property-editors/shared/property-editor-config/property-editor-config.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts index 7b1e9dc401..c17dc74ded 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts @@ -2,7 +2,7 @@ import { nothing } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { map } from 'rxjs'; import { repeat } from 'lit/directives/repeat.js'; -import { ManifestBase, ManifestTypes, umbExtensionsRegistry } from '@umbraco-cms/extensions-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/extensions-registry'; import { createExtensionElement } from '@umbraco-cms/extensions-api'; import { isManifestElementableType } from 'src/core/extensions-api/is-manifest-elementable-type.function'; import { UmbLitElement } from '@umbraco-cms/element'; @@ -40,7 +40,7 @@ export class UmbExtensionSlotElement extends UmbLitElement { umbExtensionsRegistry ?.extensionsOfType(this.type) .pipe(map((extensions) => extensions.filter(this.filter))), - async (extensions: ManifestTypes[]) => { + async (extensions) => { const oldLength = this._extensions.length; this._extensions = this._extensions.filter(current => extensions.find(incoming => incoming.alias === current.alias)); @@ -48,7 +48,7 @@ export class UmbExtensionSlotElement extends UmbLitElement { this.requestUpdate('_extensions'); } - extensions.forEach(async (extension: ManifestTypes) => { + extensions.forEach(async (extension) => { const hasExt = this._extensions.find(x => x.alias === extension.alias); if(!hasExt) { diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/create-extension-element.function.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/create-extension-element.function.ts index ba7d6c4c49..9bdf96dc5c 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/create-extension-element.function.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/create-extension-element.function.ts @@ -1,9 +1,9 @@ -import type { ManifestElementType } from '../models'; +import type { ManifestElement } from '../models'; import { hasDefaultExport } from './has-default-export.function'; import { isManifestElementNameType } from './is-manifest-element-name-type.function'; import { loadExtension } from './load-extension.function'; -export async function createExtensionElement(manifest: ManifestElementType): Promise { +export async function createExtensionElement(manifest: ManifestElement): Promise { //TODO: Write tests for these extension options: const js = await loadExtension(manifest); diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-element-name-type.function.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-element-name-type.function.ts index ccc3ae245c..a5176b90c8 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-element-name-type.function.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-element-name-type.function.ts @@ -1,7 +1,7 @@ -import type { ManifestElementType, ManifestElementWithElementName } from '../models'; +import type { ManifestElement, ManifestElementWithElementName } from '../models'; export function isManifestElementNameType(manifest: unknown): manifest is ManifestElementWithElementName { return ( - typeof manifest === 'object' && manifest !== null && (manifest as ManifestElementType).elementName !== undefined + typeof manifest === 'object' && manifest !== null && (manifest as ManifestElement).elementName !== undefined ); } diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-elementable-type.function.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-elementable-type.function.ts index ada5464619..84454a5e57 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-elementable-type.function.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-elementable-type.function.ts @@ -1,8 +1,8 @@ -import type { ManifestElementType, ManifestTypes } from "../extensions-registry/models"; +import type { ManifestElement, ManifestBase } from "../extensions-registry/models"; import { isManifestElementNameType } from "./is-manifest-element-name-type.function"; import { isManifestJSType } from "./is-manifest-js-type.function"; import { isManifestLoaderType } from "./is-manifest-loader-type.function"; -export function isManifestElementableType(manifest: ManifestTypes): manifest is ManifestElementType { +export function isManifestElementableType(manifest: ManifestBase): manifest is ManifestElement { return isManifestElementNameType(manifest) || isManifestLoaderType(manifest) || isManifestJSType(manifest); } diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-js-type.function.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-js-type.function.ts index ee56fff0b8..f49e604547 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-js-type.function.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-js-type.function.ts @@ -1,6 +1,6 @@ -import type { ManifestTypes } from "../extensions-registry/models"; +import type { ManifestBase } from "../extensions-registry/models"; import { ManifestJSType } from "./load-extension.function"; -export function isManifestJSType(manifest: ManifestTypes): manifest is ManifestJSType { +export function isManifestJSType(manifest: ManifestBase): manifest is ManifestJSType { return (manifest as ManifestJSType).js !== undefined; } \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-loader-type.function.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-loader-type.function.ts index 27ad690c4d..8303cb7e55 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-loader-type.function.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/is-manifest-loader-type.function.ts @@ -1,6 +1,6 @@ -import type { ManifestTypes } from "../extensions-registry/models"; +import type { ManifestBase } from "../extensions-registry/models"; import { ManifestLoaderType } from "./load-extension.function"; -export function isManifestLoaderType(manifest: ManifestTypes): manifest is ManifestLoaderType { +export function isManifestLoaderType(manifest: ManifestBase): manifest is ManifestLoaderType { return typeof (manifest as ManifestLoaderType).loader === 'function'; } diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-api/load-extension.function.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-api/load-extension.function.ts index c26d441c12..f1ebdbbe88 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-api/load-extension.function.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-api/load-extension.function.ts @@ -1,11 +1,11 @@ -import type { ManifestTypes } from '../models'; +import type { ManifestElement } from '../models'; import { isManifestJSType } from './is-manifest-js-type.function'; import { isManifestLoaderType } from './is-manifest-loader-type.function'; -export type ManifestLoaderType = ManifestTypes & { loader: () => Promise }; -export type ManifestJSType = ManifestTypes & { js: string }; +export type ManifestLoaderType = ManifestElement & { loader: () => Promise }; +export type ManifestJSType = ManifestElement & { js: string }; -export async function loadExtension(manifest: ManifestTypes): Promise { +export async function loadExtension(manifest: ManifestElement): Promise { try { if (isManifestLoaderType(manifest)) { return manifest.loader(); diff --git a/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts b/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts index fa6723f387..7be0281f1a 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extensions-registry/models.ts @@ -37,6 +37,7 @@ export * from './collection-bulk-action.models'; export * from './collection-view.models'; export type ManifestTypes = + | ManifestCustom | ManifestHeaderApp | ManifestSection | ManifestSectionView @@ -55,7 +56,6 @@ export type ManifestTypes = | ManifestPackageView | ManifestExternalLoginProvider | ManifestEntrypoint - | ManifestCustom | ManifestCollectionBulkAction | ManifestCollectionView; @@ -65,23 +65,6 @@ export type ManifestTypeMap = { [Manifest in ManifestTypes as Manifest['type']]: Manifest; }; -export type ManifestElementType = - | ManifestSection - | ManifestSectionView - | ManifestTree - | ManifestTreeItemAction - | ManifestWorkspace - | ManifestWorkspaceView - | ManifestPropertyAction - | ManifestPropertyEditorUI - | ManifestDashboard - | ManifestUserDashboard - | ManifestWorkspaceAction - | ManifestPackageView - | ManifestExternalLoginProvider - | ManifestCollectionBulkAction - | ManifestCollectionView; - export interface ManifestBase {