diff --git a/src/Umbraco.Web.UI.Client/schemas/api/api.yml b/src/Umbraco.Web.UI.Client/schemas/api/api.yml index 11d4069990..af959a439a 100644 --- a/src/Umbraco.Web.UI.Client/schemas/api/api.yml +++ b/src/Umbraco.Web.UI.Client/schemas/api/api.yml @@ -454,9 +454,13 @@ components: - meta - name - alias - MetaEntityAction: + MetaTreeItemAction: type: object properties: + trees: + type: array + items: + type: string label: type: string icon: @@ -465,18 +469,19 @@ components: type: number format: float required: + - trees - label - icon - weight - IManifestEntityAction: + IManifestTreeItemAction: type: object properties: type: type: string enum: - - entityAction + - treeItemAction meta: - $ref: '#/components/schemas/MetaEntityAction' + $ref: '#/components/schemas/MetaTreeItemAction' name: type: string js: @@ -668,7 +673,7 @@ components: - $ref: '#/components/schemas/IManifestSection' - $ref: '#/components/schemas/IManifestTree' - $ref: '#/components/schemas/IManifestEditor' - - $ref: '#/components/schemas/IManifestEntityAction' + - $ref: '#/components/schemas/IManifestTreeItemAction' - $ref: '#/components/schemas/IManifestPropertyEditorUI' - $ref: '#/components/schemas/IManifestDashboard' - $ref: '#/components/schemas/IManifestEditorView' @@ -681,7 +686,7 @@ components: section: '#/components/schemas/IManifestSection' tree: '#/components/schemas/IManifestTree' editor: '#/components/schemas/IManifestEditor' - entityAction: '#/components/schemas/IManifestEntityAction' + treeItemAction: '#/components/schemas/IManifestTreeItemAction' propertyEditorUI: '#/components/schemas/IManifestPropertyEditorUI' dashboard: '#/components/schemas/IManifestDashboard' editorView: '#/components/schemas/IManifestEditorView' diff --git a/src/Umbraco.Web.UI.Client/schemas/generated-schema.ts b/src/Umbraco.Web.UI.Client/schemas/generated-schema.ts index acd7e3e132..7d078a91ee 100644 --- a/src/Umbraco.Web.UI.Client/schemas/generated-schema.ts +++ b/src/Umbraco.Web.UI.Client/schemas/generated-schema.ts @@ -145,16 +145,17 @@ export interface components { elementName?: string; alias: string; }; - MetaEntityAction: { + MetaTreeItemAction: { + trees: string[]; label: string; icon: string; /** Format: float */ weight: number; }; - IManifestEntityAction: { + IManifestTreeItemAction: { /** @enum {string} */ - type: "entityAction"; - meta: components["schemas"]["MetaEntityAction"]; + type: "treeItemAction"; + meta: components["schemas"]["MetaTreeItemAction"]; name: string; js?: string; elementName?: string; @@ -233,7 +234,7 @@ export interface components { | components["schemas"]["IManifestSection"] | components["schemas"]["IManifestTree"] | components["schemas"]["IManifestEditor"] - | components["schemas"]["IManifestEntityAction"] + | components["schemas"]["IManifestTreeItemAction"] | components["schemas"]["IManifestPropertyEditorUI"] | components["schemas"]["IManifestDashboard"] | components["schemas"]["IManifestEditorView"] diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/sections/section.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/sections/section.context.ts index 8b5d8b64ed..3a60b827d2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/sections/section.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/sections/section.context.ts @@ -1,6 +1,6 @@ -import { BehaviorSubject } from 'rxjs'; +import { BehaviorSubject, ReplaySubject } from 'rxjs'; -import type { ManifestSection } from '../../core/models'; +import type { ManifestSection, ManifestTree } from '../../core/models'; export class UmbSectionContext { // TODO: figure out how fine grained we want to make our observables. @@ -17,6 +17,10 @@ export class UmbSectionContext { }); public readonly data = this._data.asObservable(); + // TODO: what is the best context to put this in? + private _activeTree = new ReplaySubject(1); + public readonly activeTree = this._activeTree.asObservable(); + constructor(section: ManifestSection) { if (!section) return; this._data.next(section); @@ -30,4 +34,8 @@ export class UmbSectionContext { public getData() { return this._data.getValue(); } + + public setActiveTree(tree: ManifestTree) { + this._activeTree.next(tree); + } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/actions/action-list-page.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/actions/action-list-page.element.ts index 914ce3e44c..9b88d272e3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/actions/action-list-page.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/actions/action-list-page.element.ts @@ -1,11 +1,15 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement } from 'lit/decorators.js'; -import type { ManifestEntityAction } from '../../../core/models'; +import { customElement, state } from 'lit/decorators.js'; +import type { ManifestEntityAction, ManifestTree } from '../../../core/models'; import UmbActionElement from './action.element'; +import { UmbExtensionRegistry } from '../../../core/extension'; +import { UmbContextConsumerMixin } from '../../../core/context'; +import { map, Subscription } from 'rxjs'; +import { UmbSectionContext } from '../../sections/section.context'; @customElement('umb-action-list-page') -export class UmbActionListPageElement extends UmbActionElement { +export class UmbActionListPageElement extends UmbContextConsumerMixin(UmbActionElement) { static styles = [ UUITextStyles, css` @@ -24,57 +28,74 @@ export class UmbActionListPageElement extends UmbActionElement { `, ]; - //TODO Replace with real data - private _actionList: Array Promise }> = [ - { - name: 'create', - alias: 'action.create', - meta: { - label: 'Create', - icon: 'add', - weight: 10, - }, - loader: () => import('./tree-action-create.element'), - type: 'entityAction', - }, - { - name: 'delete', - alias: 'action.delete', - meta: { - label: 'Delete', - icon: 'delete', - weight: 20, - }, - loader: () => import('./tree-action-delete.element'), - type: 'entityAction', - }, - { - name: 'reload', - alias: 'action.reload', - meta: { - label: 'Reload', - icon: 'sync', - weight: 30, - }, - loader: () => import('./tree-action-reload.element'), - type: 'entityAction', - }, - ]; + @state() + private _actions: Array = []; - renderActions() { - return this._actionList + @state() + private _activeTree?: ManifestTree; + + private _extensionRegistry?: UmbExtensionRegistry; + private _sectionContext?: UmbSectionContext; + + private _treeItemActionsSubscription?: Subscription; + private _activeTreeSubscription?: Subscription; + + connectedCallback() { + super.connectedCallback(); + + this.consumeContext('umbExtensionRegistry', (extensionRegistry) => { + this._extensionRegistry = extensionRegistry; + this._observeTreeItemActions(); + }); + + this.consumeContext('umbSectionContext', (sectionContext) => { + this._sectionContext = sectionContext; + this._observeActiveTree(); + this._observeTreeItemActions(); + }); + } + + private _observeTreeItemActions() { + if (!this._extensionRegistry || !this._sectionContext) return; + + this._treeItemActionsSubscription?.unsubscribe(); + + this._treeItemActionsSubscription = this._extensionRegistry + ?.extensionsOfType('treeItemAction') + .pipe(map((actions) => actions.filter((action) => action.meta.trees.includes(this._activeTree?.alias)))) + .subscribe((actions) => { + this._actions = actions; + }); + } + + private _observeActiveTree() { + this._activeTreeSubscription?.unsubscribe(); + + this._activeTreeSubscription = this._sectionContext?.activeTree.subscribe((tree) => { + this._activeTree = tree; + }); + } + + private _renderActions() { + return this._actions .sort((a, b) => a.meta.weight - b.meta.weight) .map((action) => { return html` `; }); } + disconnectCallback(): void { + super.disconnectCallback(); + this._treeItemActionsSubscription?.unsubscribe(); + this._activeTreeSubscription?.unsubscribe(); + } + render() { return html`

${this._entity.name}

-
${this.renderActions()}
+
${this._renderActions()}
`; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/actions/action-data-type-create.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/actions/action-data-type-create.element.ts new file mode 100644 index 0000000000..136f6c8302 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/actions/action-data-type-create.element.ts @@ -0,0 +1,28 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html, LitElement } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; +import type { ManifestEntityAction } from '../../../../core/models'; + +@customElement('umb-tree-action-data-type-create') +export default class UmbTreeActionDataTypeCreateElement extends LitElement { + static styles = [UUITextStyles, css``]; + + @property({ attribute: false }) + public treeAction?: ManifestEntityAction; + + private _handleLabelClick() { + console.log('create new treee item'); + } + + render() { + return html` + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-tree-action-data-type-create': UmbTreeActionDataTypeCreateElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/actions/action-data-type-delete.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/actions/action-data-type-delete.element.ts new file mode 100644 index 0000000000..56cd9aa9fe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/actions/action-data-type-delete.element.ts @@ -0,0 +1,28 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html, LitElement } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; +import type { ManifestEntityAction } from '../../../../core/models'; + +@customElement('umb-tree-action-data-type-delete') +export default class UmbTreeActionDataTypeDeleteElement extends LitElement { + static styles = [UUITextStyles, css``]; + + @property({ attribute: false }) + public treeAction?: ManifestEntityAction; + + private _handleLabelClick() { + console.log('delete this tree item'); + } + + render() { + return html` + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-tree-action-data-type-delete': UmbTreeActionDataTypeDeleteElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/tree-data-types.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/tree-data-types.element.ts index 166d54e197..b9f132cfce 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/tree-data-types.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/data-types/tree-data-types.element.ts @@ -5,11 +5,15 @@ import '../shared/tree-navigator.element'; import { UmbTreeDataTypesContext } from './tree-data-types.context'; import { UmbContextConsumerMixin, UmbContextProviderMixin } from '../../../core/context'; import { UmbEntityStore } from '../../../core/stores/entity.store'; +import type { ManifestTree } from '../../../core/models'; @customElement('umb-tree-data-types') export class UmbTreeDataTypesElement extends UmbContextProviderMixin(UmbContextConsumerMixin(LitElement)) { static styles = [UUITextStyles, css``]; + @property({ type: Object, attribute: false }) + tree?: ManifestTree; + private _selectable = false; @property({ type: Boolean, reflect: true }) get selectable() { @@ -30,9 +34,9 @@ export class UmbTreeDataTypesElement extends UmbContextProviderMixin(UmbContextC this.consumeContext('umbEntityStore', (entityStore: UmbEntityStore) => { this._entityStore = entityStore; - if (!this._entityStore) return; + if (!this._entityStore || !this.tree) return; - this._treeContext = new UmbTreeDataTypesContext(this._entityStore); + this._treeContext = new UmbTreeDataTypesContext(this.tree, this._entityStore); this._treeContext.setSelectable(this.selectable); this.provideContext('umbTreeContext', this._treeContext); }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/document-types/tree-document-types.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/document-types/tree-document-types.element.ts index 5fb2ac8457..d57dde7cae 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/document-types/tree-document-types.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/document-types/tree-document-types.element.ts @@ -6,11 +6,15 @@ import { UmbEntityStore } from '../../../core/stores/entity.store'; import { UmbTreeDocumentTypesContext } from './tree-document-types.context'; import '../shared/tree-navigator.element'; +import type { ManifestTree } from '../../../core/models'; @customElement('umb-tree-document-types') export class UmbTreeDocumentTypes extends UmbContextConsumerMixin(UmbContextProviderMixin(LitElement)) { static styles = [UUITextStyles, css``]; + @property({ type: Object, attribute: false }) + tree?: ManifestTree; + @property({ type: String }) public alias = ''; @@ -22,9 +26,9 @@ export class UmbTreeDocumentTypes extends UmbContextConsumerMixin(UmbContextProv this.consumeContext('umbEntityStore', (entityStore: UmbEntityStore) => { this._entityStore = entityStore; - if (!this._entityStore) return; + if (!this._entityStore || !this.tree) return; - this._treeContext = new UmbTreeDocumentTypesContext(this._entityStore); + this._treeContext = new UmbTreeDocumentTypesContext(this.tree, this._entityStore); this.provideContext('umbTreeContext', this._treeContext); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/documents/tree-documents.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/documents/tree-documents.element.ts index 1ed65fad34..bb22fa8e97 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/documents/tree-documents.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/documents/tree-documents.element.ts @@ -6,11 +6,15 @@ import { UmbTreeDocumentContext } from './tree-documents.context'; import { UmbContextConsumerMixin, UmbContextProviderMixin } from '../../../core/context'; import { UmbEntityStore } from '../../../core/stores/entity.store'; import { Subscription } from 'rxjs'; +import type { ManifestTree } from '../../../core/models'; @customElement('umb-tree-document') export class UmbTreeDocumentElement extends UmbContextProviderMixin(UmbContextConsumerMixin(LitElement)) { static styles = [UUITextStyles, css``]; + @property({ type: Object, attribute: false }) + tree?: ManifestTree; + private _selectable = false; @property({ type: Boolean, reflect: true }) get selectable() { @@ -44,9 +48,9 @@ export class UmbTreeDocumentElement extends UmbContextProviderMixin(UmbContextCo this.consumeContext('umbEntityStore', (entityStore: UmbEntityStore) => { this._entityStore = entityStore; - if (!this._entityStore) return; + if (!this._entityStore || !this.tree) return; - this._treeContext = new UmbTreeDocumentContext(this._entityStore); + this._treeContext = new UmbTreeDocumentContext(this.tree, this._entityStore); this._treeContext.setSelectable(this.selectable); this._treeContext.setSelection(this.selection); this._observeSelection(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/extensions/tree-extensions.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/extensions/tree-extensions.element.ts index 6f0df09c6a..7ee32f6eca 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/extensions/tree-extensions.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/extensions/tree-extensions.element.ts @@ -1,18 +1,21 @@ import { css, html, LitElement } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement } from 'lit/decorators.js'; +import { customElement, property } from 'lit/decorators.js'; import { UmbTreeExtensionsContext } from './tree-extensions.context'; import { UmbContextConsumerMixin, UmbContextProviderMixin } from '../../../core/context'; import { UmbEntityStore } from '../../../core/stores/entity.store'; import '../shared/tree-navigator.element'; +import type { ManifestTree } from '../../../core/models'; @customElement('umb-tree-extensions') export class UmbTreeExtensionsElement extends UmbContextProviderMixin(UmbContextConsumerMixin(LitElement)) { static styles = [UUITextStyles, css``]; - private _treeContext?: UmbTreeExtensionsContext; + @property({ type: Object, attribute: false }) + tree?: ManifestTree; + private _treeContext?: UmbTreeExtensionsContext; private _entityStore?: UmbEntityStore; constructor() { @@ -20,9 +23,9 @@ export class UmbTreeExtensionsElement extends UmbContextProviderMixin(UmbContext this.consumeContext('umbEntityStore', (entityStore: UmbEntityStore) => { this._entityStore = entityStore; - if (!this._entityStore) return; + if (!this._entityStore || !this.tree) return; - this._treeContext = new UmbTreeExtensionsContext(this._entityStore); + this._treeContext = new UmbTreeExtensionsContext(this.tree, this._entityStore); this.provideContext('umbTreeContext', this._treeContext); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/media/tree-media.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/media/tree-media.element.ts index e0cae3eae0..7a72e6be55 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/media/tree-media.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/media/tree-media.element.ts @@ -1,17 +1,20 @@ import { css, html, LitElement } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement } from 'lit/decorators.js'; +import { customElement, property } from 'lit/decorators.js'; import '../shared/tree-navigator.element'; import { UmbTreeMediaContext } from './tree-media.context'; import { UmbContextConsumerMixin, UmbContextProviderMixin } from '../../../core/context'; import { UmbEntityStore } from '../../../core/stores/entity.store'; +import type { ManifestTree } from '../../../core/models'; @customElement('umb-tree-media') export class UmbTreeMediaElement extends UmbContextProviderMixin(UmbContextConsumerMixin(LitElement)) { static styles = [UUITextStyles, css``]; - private _treeContext?: UmbTreeMediaContext; + @property({ type: Object, attribute: false }) + tree?: ManifestTree; + private _treeContext?: UmbTreeMediaContext; private _entityStore?: UmbEntityStore; constructor() { @@ -19,9 +22,9 @@ export class UmbTreeMediaElement extends UmbContextProviderMixin(UmbContextConsu this.consumeContext('umbEntityStore', (entityStore: UmbEntityStore) => { this._entityStore = entityStore; - if (!this._entityStore) return; + if (!this._entityStore || !this.tree) return; - this._treeContext = new UmbTreeMediaContext(this._entityStore); + this._treeContext = new UmbTreeMediaContext(this.tree, this._entityStore); this.provideContext('umbTreeContext', this._treeContext); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/member-groups/tree-member-groups.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/member-groups/tree-member-groups.element.ts index f41a9d0dec..f023b6f47a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/member-groups/tree-member-groups.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/member-groups/tree-member-groups.element.ts @@ -1,19 +1,22 @@ import { css, html, LitElement } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement } from 'lit/decorators.js'; +import { customElement, property } from 'lit/decorators.js'; import '../shared/tree-navigator.element'; import { UmbContextConsumerMixin, UmbContextProviderMixin } from '../../../core/context'; import { UmbTreeMemberGroupsContext } from './tree-member-groups.context'; import { UmbEntityStore } from '../../../core/stores/entity.store'; +import type { ManifestTree } from '../../../core/models'; @customElement('umb-tree-member-groups') export class UmbTreeMemberGroups extends UmbContextProviderMixin(UmbContextConsumerMixin(LitElement)) { static styles = [UUITextStyles, css``]; - private _treeContext?: UmbTreeMemberGroupsContext; + @property({ type: Object, attribute: false }) + tree?: ManifestTree; + private _treeContext?: UmbTreeMemberGroupsContext; private _entityStore?: UmbEntityStore; constructor() { @@ -21,9 +24,9 @@ export class UmbTreeMemberGroups extends UmbContextProviderMixin(UmbContextConsu this.consumeContext('umbEntityStore', (entityStore: UmbEntityStore) => { this._entityStore = entityStore; - if (!this._entityStore) return; + if (!this._entityStore || !this.tree) return; - this._treeContext = new UmbTreeMemberGroupsContext(this._entityStore); + this._treeContext = new UmbTreeMemberGroupsContext(this.tree, this._entityStore); this.provideContext('umbTreeContext', this._treeContext); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/members/tree-members.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/members/tree-members.element.ts index 9626aa3eb0..d970fa66e3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/members/tree-members.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/members/tree-members.element.ts @@ -1,19 +1,22 @@ import { css, html, LitElement } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement } from 'lit/decorators.js'; +import { customElement, property } from 'lit/decorators.js'; import { UmbContextConsumerMixin, UmbContextProviderMixin } from '../../../core/context'; import { UmbTreeMembersContext } from './tree-members.context'; import { UmbEntityStore } from '../../../core/stores/entity.store'; import '../shared/tree-navigator.element'; +import type { ManifestTree } from '../../../core/models'; @customElement('umb-tree-members') export class UmbTreeMembers extends UmbContextProviderMixin(UmbContextConsumerMixin(LitElement)) { static styles = [UUITextStyles, css``]; - private _treeContext?: UmbTreeMembersContext; + @property({ type: Object, attribute: false }) + tree?: ManifestTree; + private _treeContext?: UmbTreeMembersContext; private _entityStore?: UmbEntityStore; constructor() { @@ -21,9 +24,9 @@ export class UmbTreeMembers extends UmbContextProviderMixin(UmbContextConsumerMi this.consumeContext('umbEntityStore', (entityStore: UmbEntityStore) => { this._entityStore = entityStore; - if (!this._entityStore) return; + if (!this._entityStore || !this.tree) return; - this._treeContext = new UmbTreeMembersContext(this._entityStore); + this._treeContext = new UmbTreeMembersContext(this.tree, this._entityStore); this.provideContext('umbTreeContext', this._treeContext); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/shared/tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/shared/tree-item.element.ts index ee67a9abf1..d803b86904 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/shared/tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/shared/tree-item.element.ts @@ -143,6 +143,9 @@ export class UmbTreeItem extends UmbContextConsumerMixin(LitElement) { } private _openActions() { + if (!this._treeContext || !this._sectionContext) return; + + this._sectionContext?.setActiveTree(this._treeContext?.tree); this._actionService?.open({ name: this.label, key: this.itemKey }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/trees/tree.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/trees/tree.context.ts index 9216da1c28..ed6f99b4a8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/trees/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/trees/tree.context.ts @@ -1,8 +1,10 @@ import { BehaviorSubject, map, Observable } from 'rxjs'; +import type { ManifestTree } from '../../core/models'; import type { UmbEntityStore } from '../../core/stores/entity.store'; import { Entity } from '../../mocks/data/entity.data'; export interface UmbTreeContext { + tree: ManifestTree; rootKey: string; entityStore: UmbEntityStore; readonly selectable: Observable; @@ -14,6 +16,7 @@ export interface UmbTreeContext { } export class UmbTreeContextBase implements UmbTreeContext { + public tree: ManifestTree; public entityStore: UmbEntityStore; public rootKey = ''; @@ -23,7 +26,8 @@ export class UmbTreeContextBase implements UmbTreeContext { private _selection: BehaviorSubject> = new BehaviorSubject(>[]); public readonly selection: Observable> = this._selection.asObservable(); - constructor(entityStore: UmbEntityStore) { + constructor(tree: ManifestTree, entityStore: UmbEntityStore) { + this.tree = tree; this.entityStore = entityStore; } diff --git a/src/Umbraco.Web.UI.Client/src/core/extension/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/core/extension/extension.registry.ts index 593f4ca290..2f7e0ae6d0 100644 --- a/src/Umbraco.Web.UI.Client/src/core/extension/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/core/extension/extension.registry.ts @@ -15,8 +15,8 @@ import type { ManifestPropertyEditorUI, ManifestSection, ManifestTree, + ManifestTreeItemAction, ManifestEditor, - ManifestEntityAction, ManifestCustom, } from '../models'; @@ -61,7 +61,7 @@ export class UmbExtensionRegistry { extensionsOfType(type: 'section'): Observable>; extensionsOfType(type: 'tree'): Observable>; extensionsOfType(type: 'editor'): Observable>; - extensionsOfType(type: 'entityAction'): Observable>; + extensionsOfType(type: 'treeItemAction'): Observable>; extensionsOfType(type: 'dashboard'): Observable>; extensionsOfType(type: 'editorView'): Observable>; extensionsOfType(type: 'propertyEditorUI'): Observable>; diff --git a/src/Umbraco.Web.UI.Client/src/temp-internal-manifests.ts b/src/Umbraco.Web.UI.Client/src/temp-internal-manifests.ts index 3c839f5dbd..ef93d39fd7 100644 --- a/src/Umbraco.Web.UI.Client/src/temp-internal-manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/temp-internal-manifests.ts @@ -387,13 +387,14 @@ export const internalManifests: Array Promise import('./backoffice/editors/extensions/editor-extensions.element'), + name: 'Data Type Create', + loader: () => import('./backoffice/trees/data-types/actions/action-data-type-create.element'), meta: { + trees: ['Umb.Tree.DataTypes'], label: 'Create', - icon: 'plus', + icon: 'add', weight: 100, }, }, diff --git a/src/Umbraco.Web.UI.Client/temp-schema-generator/manifests.ts b/src/Umbraco.Web.UI.Client/temp-schema-generator/manifests.ts index 332bcf63c2..c66e7f3ba3 100644 --- a/src/Umbraco.Web.UI.Client/temp-schema-generator/manifests.ts +++ b/src/Umbraco.Web.UI.Client/temp-schema-generator/manifests.ts @@ -15,7 +15,7 @@ export type Manifest = | IManifestSection | IManifestTree | IManifestEditor - | IManifestEntityAction + | IManifestTreeItemAction | IManifestPropertyEditorUI | IManifestDashboard | IManifestEditorView @@ -27,7 +27,7 @@ export type ManifestStandardTypes = | 'section' | 'tree' | 'editor' - | 'entityAction' + | 'treeItemAction' | 'propertyEditorUI' | 'dashboard' | 'editorView' @@ -57,7 +57,8 @@ export interface MetaEditor { entityType: string; } -export interface MetaEntityAction { +export interface MetaTreeItemAction { + trees: Array; label: string; icon: string; weight: number; @@ -114,9 +115,9 @@ export interface IManifestEditor extends IManifestElement { meta: MetaEditor; } -export interface IManifestEntityAction extends IManifestElement { - type: 'entityAction'; - meta: MetaEntityAction; +export interface IManifestTreeItemAction extends IManifestElement { + type: 'treeItemAction'; + meta: MetaTreeItemAction; } export interface IManifestPropertyEditorUI extends IManifestElement {