From 030a72bbcb63c90f05a4220a4a2cb2cb72186a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 1 Jun 2023 13:15:17 +0200 Subject: [PATCH 01/49] data-type-flow-data-type-picker --- ...icker-flow-data-type-picker-modal.token.ts | 16 ++ .../src/packages/core/modal/token/index.ts | 1 + .../property-editor-ui-picker-modal.token.ts | 2 +- ...ker-flow-data-type-picker-modal.element.ts | 169 ++++++++++++++++++ .../data-type-picker-flow-modal.element.ts | 20 ++- .../settings/data-types/modals/manifests.ts | 8 +- ...ata-type-details-workspace-view.element.ts | 5 + 7 files changed, 210 insertions(+), 11 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts new file mode 100644 index 0000000000..051cc450d9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts @@ -0,0 +1,16 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbDataTypePickerFlowDataTypePickerModalData { + selection?: Array; + propertyEditorUiAlias: string; +} + +export type UmbDataTypePickerFlowDataTypePickerModalResult = undefined; + +export const UMB_DATA_TYPE_PICKER_FLOW_DATA_TYPE_PICKER_MODAL = new UmbModalToken< + UmbDataTypePickerFlowDataTypePickerModalData, + UmbDataTypePickerFlowDataTypePickerModalResult +>('Umb.Modal.DataTypePickerFlowDataTypePicker', { + type: 'sidebar', + size: 'small', +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts index e7b1cd82c9..668ebab189 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts @@ -30,3 +30,4 @@ export * from './partial-view-picker-modal.token.js'; export * from './dictionary-item-picker-modal.token.js'; export * from './data-type-picker-modal.token.js'; export * from './data-type-picker-flow-modal.token.js'; +export * from './data-type-picker-flow-data-type-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/property-editor-ui-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/property-editor-ui-picker-modal.token.ts index 9bff24f2fe..8cdbd227ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/property-editor-ui-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/property-editor-ui-picker-modal.token.ts @@ -12,7 +12,7 @@ export type UmbPropertyEditorUIPickerModalResult = { export const UMB_PROPERTY_EDITOR_UI_PICKER_MODAL = new UmbModalToken< UmbPropertyEditorUIPickerModalData, UmbPropertyEditorUIPickerModalResult ->('Umb.Modal.PropertyEditorUIPicker', { +>('Umb.Modal.PropertyEditorUiPicker', { type: 'sidebar', size: 'small', }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts new file mode 100644 index 0000000000..5389525a6a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -0,0 +1,169 @@ +import { UmbDataTypeRepository } from '../../repository/data-type.repository.js'; +import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; +import { + UmbPropertyEditorUIPickerModalData, + UmbPropertyEditorUIPickerModalResult, + UmbModalHandler, + UmbDataTypePickerFlowDataTypePickerModalData, +} from '@umbraco-cms/backoffice/modal'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { FolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +@customElement('umb-data-type-picker-flow-data-type-picker-modal') +export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitElement { + @property({ type: Object }) + data?: UmbDataTypePickerFlowDataTypePickerModalData; + + @state() + private _dataTypes: Array = []; + + @state() + private _selection: Array = []; + + connectedCallback(): void { + super.connectedCallback(); + + if (!this.data) return; + + this._selection = this.data.selection ?? []; + this._observeDataTypesOf(this.data.propertyEditorUiAlias); + } + + private async _observeDataTypesOf(propertyEditorUiAlias: string) { + if (!this.data) return; + + const dataTypeRepository = new UmbDataTypeRepository(this); + + // TODO: make an end-point just retrieving the data types using a given property editor ui alias. + const { data } = await dataTypeRepository.requestRootTreeItems(); + + // Filter these: + //data?.items by propertyEditorUiAlias + dataTypeRepository.byPropertyEditorUiAlias(propertyEditorUiAlias); + + // TODO: make an observable + } + + private _handleClick(dataType: FolderTreeItemResponseModel) { + if (dataType.id) { + this._select(dataType.id); + } + } + + private _select(alias: string) { + this._selection = [alias]; + } + + private _close() { + this.modalHandler?.reject(); + } + + @property({ attribute: false }) + modalHandler?: UmbModalHandler; + + private _submit() { + this.modalHandler?.submit({ selection: this._selection }); + } + + render() { + return html` + + ${this._renderDataTypes()} +
+ +
+
+ `; + } + + private _renderDataTypes() { + return html`
    + ${repeat( + this._dataTypes, + (dataType) => dataType.id, + (dataType) => + dataType.id + ? html`
  • + +
  • ` + : '' + )} +
`; + } + + static styles = [ + UUITextStyles, + css` + #filter { + width: 100%; + margin-bottom: var(--uui-size-space-4); + } + + #filter-icon { + padding-left: var(--uui-size-space-2); + } + + #item-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); + margin: 0; + padding: 0; + grid-gap: var(--uui-size-space-4); + } + + #item-grid .item { + display: flex; + align-items: flex-start; + justify-content: center; + list-style: none; + height: 100%; + border: 1px solid transparent; + border-radius: var(--uui-border-radius); + } + + #item-grid .item:hover { + background: var(--uui-color-surface-emphasis); + color: var(--uui-color-interactive-emphasis); + cursor: pointer; + } + + #item-grid .item[selected] button { + background: var(--uui-color-selected); + color: var(--uui-color-selected-contrast); + } + + #item-grid .item button { + background: none; + border: none; + cursor: pointer; + padding: var(--uui-size-space-3); + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + font-size: 0.8rem; + height: 100%; + width: 100%; + color: var(--uui-color-interactive); + border-radius: var(--uui-border-radius); + } + + #item-grid .item .icon { + font-size: 2em; + margin-bottom: var(--uui-size-space-2); + } + `, + ]; +} + +export default UmbDataTypePickerFlowDataTypePickerModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-data-type-picker-flow-data-type-picker-modal': UmbDataTypePickerFlowDataTypePickerModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index 31936de95b..3792b34df9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -4,8 +4,8 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { groupBy } from '@umbraco-cms/backoffice/external/lodash'; import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { - UmbPropertyEditorUIPickerModalData, - UmbPropertyEditorUIPickerModalResult, + UmbDataTypePickerFlowModalData, + UmbDataTypePickerFlowModalResult, UmbModalHandler, } from '@umbraco-cms/backoffice/modal'; import { ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -18,18 +18,18 @@ interface GroupedItems { @customElement('umb-data-type-picker-flow-modal') export class UmbDataTypePickerFlowModalElement extends UmbLitElement { @property({ attribute: false }) - modalHandler?: UmbModalHandler; + modalHandler?: UmbModalHandler; @property({ type: Object }) - public get data(): UmbPropertyEditorUIPickerModalData | undefined { + public get data(): UmbDataTypePickerFlowModalData | undefined { return this._data; } - public set data(value: UmbPropertyEditorUIPickerModalData | undefined) { + public set data(value: UmbDataTypePickerFlowModalData | undefined) { this._data = value; this._selection = this.data?.selection ?? []; this._submitLabel = this.data?.submitLabel ?? this._submitLabel; } - private _data?: UmbPropertyEditorUIPickerModalData | undefined; + private _data?: UmbDataTypePickerFlowModalData | undefined; @state() private _groupedDataTypes?: GroupedItems; @@ -48,6 +48,8 @@ export class UmbDataTypePickerFlowModalElement extends UmbLitElement { #propertyEditorUIs: Array = []; #currentFilterQuery = ''; + //UMB_DATA_TYPE_PICKER_FLOW_UI_PICKER_MODAL; + constructor() { super(); this.#repository = new UmbDataTypeRepository(this); @@ -72,8 +74,8 @@ export class UmbDataTypePickerFlowModalElement extends UmbLitElement { }); } - private _handleUIClick(propertyEditorUi: ManifestPropertyEditorUi) { - alert('To BE DONE.'); + private _handleUiClick(propertyEditorUi: ManifestPropertyEditorUi) { + // Open a modal of available data types for the selected Property Editor UI. } private _handleDataTypeClick(dataType: EntityTreeItemResponseModel) { @@ -195,7 +197,7 @@ export class UmbDataTypePickerFlowModalElement extends UmbLitElement { uis, (propertyEditorUI) => propertyEditorUI.alias, (propertyEditorUI) => html`
  • - diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/manifests.ts index f1fb7f9987..7abab6de4a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/manifests.ts @@ -3,7 +3,7 @@ import type { ManifestModal } from '@umbraco-cms/backoffice/extension-registry'; const modals: Array = [ { type: 'modal', - alias: 'Umb.Modal.PropertyEditorUIPicker', + alias: 'Umb.Modal.PropertyEditorUiPicker', name: 'Property Editor UI Picker Modal', loader: () => import('./property-editor-ui-picker/property-editor-ui-picker-modal.element.js'), }, @@ -13,6 +13,12 @@ const modals: Array = [ name: 'Data Type Picker Flow Modal', loader: () => import('./data-type-picker-flow/data-type-picker-flow-modal.element.js'), }, + { + type: 'modal', + alias: 'Umb.Modal.DataTypePickerFlowDataTypePicker', + name: 'Data Type Picker Flow UI Picker Modal', + loader: () => import('./data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.js'), + }, ]; export const manifests = [...modals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts index e166ab65d6..d6a697e45d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts @@ -197,6 +197,11 @@ export class UmbDataTypeDetailsWorkspaceViewEditElement css` :host { display: block; + margin: var(--uui-size-layout-1); + padding-bottom: var(--uui-size-layout-1); + } + + uui-box { padding: var(--uui-size-layout-1); } `, From 2eb1a726f64a84101d44743640301c4845d2d406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 1 Jun 2023 13:27:58 +0200 Subject: [PATCH 02/49] flow step 2 initially setup done --- ...ker-flow-data-type-picker-modal.element.ts | 37 ++++++++++--------- .../repository/data-type.repository.ts | 7 ++++ .../repository/data-type.tree.store.ts | 9 +++++ 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index 5389525a6a..eb70fb7831 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -16,7 +16,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme data?: UmbDataTypePickerFlowDataTypePickerModalData; @state() - private _dataTypes: Array = []; + private _dataTypes?: Array; @state() private _selection: Array = []; @@ -40,9 +40,10 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme // Filter these: //data?.items by propertyEditorUiAlias - dataTypeRepository.byPropertyEditorUiAlias(propertyEditorUiAlias); - - // TODO: make an observable + const source = await dataTypeRepository.treeItemsByPropertyEditorUiAlias(propertyEditorUiAlias); + this.observe(source, (dataTypes) => { + this._dataTypes = dataTypes; + }); } private _handleClick(dataType: FolderTreeItemResponseModel) { @@ -79,19 +80,21 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme private _renderDataTypes() { return html`
      - ${repeat( - this._dataTypes, - (dataType) => dataType.id, - (dataType) => - dataType.id - ? html`
    • - -
    • ` - : '' - )} + ${this._dataTypes + ? repeat( + this._dataTypes, + (dataType) => dataType.id, + (dataType) => + dataType.id + ? html`
    • + +
    • ` + : '' + ) + : ''}
    `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.repository.ts index aa5d7b81fe..47fddbef00 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.repository.ts @@ -71,6 +71,7 @@ export class UmbDataTypeRepository this.#moveSource = new UmbDataTypeMoveServerDataSource(this.#host); this.#copySource = new UmbDataTypeCopyServerDataSource(this.#host); + // TODO: Make a method that takes the controllers and returns a promise, just to simplify this: this.#init = Promise.all([ new UmbContextConsumerController(this.#host, UMB_DATA_TYPE_STORE_CONTEXT_TOKEN, (instance) => { this.#detailStore = instance; @@ -187,6 +188,12 @@ export class UmbDataTypeRepository return this.#detailStore!.byId(id); } + async treeItemsByPropertyEditorUiAlias(propertyEditorUiAlias: string) { + if (!propertyEditorUiAlias) throw new Error('propertyEditorUiAlias is missing'); + await this.#init; + return this.#treeStore!.withPropertyEditorUiAlias(propertyEditorUiAlias); + } + async create(dataType: CreateDataTypeRequestModel) { if (!dataType) throw new Error('Data Type is missing'); if (!dataType.id) throw new Error('Data Type id is missing'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.tree.store.ts index d2dc4686d8..63e5170482 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.tree.store.ts @@ -18,6 +18,15 @@ export class UmbDataTypeTreeStore extends UmbEntityTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_DATA_TYPE_TREE_STORE_CONTEXT_TOKEN.toString()); } + + withPropertyEditorUiAlias(propertyEditorUiAlias: string) { + // TODO: Use a model for the data-type tree items: ^^Most likely it should be parsed to the UmbEntityTreeStore as a generic type. + return this._data.getObservablePart((item) => { + if ((item as any).propertyEditorUiAlias === propertyEditorUiAlias) { + return item; + } + }); + } } export const UMB_DATA_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDataTypeTreeStore'); From 46bf87f2caeb3b8f8ff999fe3f7855670354b547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 1 Jun 2023 13:29:15 +0200 Subject: [PATCH 03/49] todo --- .../data-type-picker-flow-data-type-picker-modal.element.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index eb70fb7831..1cdb8030fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -36,10 +36,9 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme const dataTypeRepository = new UmbDataTypeRepository(this); // TODO: make an end-point just retrieving the data types using a given property editor ui alias. - const { data } = await dataTypeRepository.requestRootTreeItems(); + await dataTypeRepository.requestRootTreeItems(); - // Filter these: - //data?.items by propertyEditorUiAlias + // TODO: Use the asObservable from above onces end-point has been made. const source = await dataTypeRepository.treeItemsByPropertyEditorUiAlias(propertyEditorUiAlias); this.observe(source, (dataTypes) => { this._dataTypes = dataTypes; From da27b970c0f2bdda3fa91f9c83b8e1589b310f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 1 Jun 2023 14:22:45 +0200 Subject: [PATCH 04/49] initial version --- ...icker-flow-data-type-picker-modal.token.ts | 6 +- ...ker-flow-data-type-picker-modal.element.ts | 42 ++++++------ .../data-type-picker-flow-modal.element.ts | 64 +++++++++++-------- .../data-type-picker-flow-modal.stories.ts | 19 ------ .../repository/data-type.repository.ts | 4 +- .../data-types/repository/data-type.store.ts | 7 ++ .../repository/data-type.tree.store.ts | 9 --- 7 files changed, 72 insertions(+), 79 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts index 051cc450d9..c86745bf55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts @@ -1,11 +1,13 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbDataTypePickerFlowDataTypePickerModalData { - selection?: Array; propertyEditorUiAlias: string; } -export type UmbDataTypePickerFlowDataTypePickerModalResult = undefined; +export type UmbDataTypePickerFlowDataTypePickerModalResult = { + dataTypeId?: string; + createNew?: boolean; +}; export const UMB_DATA_TYPE_PICKER_FLOW_DATA_TYPE_PICKER_MODAL = new UmbModalToken< UmbDataTypePickerFlowDataTypePickerModalData, diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index 1cdb8030fc..2453deff5b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -2,10 +2,9 @@ import { UmbDataTypeRepository } from '../../repository/data-type.repository.js' import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { - UmbPropertyEditorUIPickerModalData, - UmbPropertyEditorUIPickerModalResult, UmbModalHandler, UmbDataTypePickerFlowDataTypePickerModalData, + UmbDataTypePickerFlowDataTypePickerModalResult, } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { FolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -18,15 +17,11 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme @state() private _dataTypes?: Array; - @state() - private _selection: Array = []; - connectedCallback(): void { super.connectedCallback(); if (!this.data) return; - this._selection = this.data.selection ?? []; this._observeDataTypesOf(this.data.propertyEditorUiAlias); } @@ -35,36 +30,45 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme const dataTypeRepository = new UmbDataTypeRepository(this); + // TODO: This is a hack to get the data types of a property editor ui alias. + // TODO: Make sure filtering works data-type that does not have a property editor ui, but should be using the default property editor UI for those. // TODO: make an end-point just retrieving the data types using a given property editor ui alias. - await dataTypeRepository.requestRootTreeItems(); + const { data } = await dataTypeRepository.requestRootTreeItems(); + + if (!data) return; + + await Promise.all( + data.items.map((item) => { + if (item.id) { + return dataTypeRepository.requestById(item.id); + } + return Promise.resolve(); + }) + ); // TODO: Use the asObservable from above onces end-point has been made. - const source = await dataTypeRepository.treeItemsByPropertyEditorUiAlias(propertyEditorUiAlias); + const source = await dataTypeRepository.byPropertyEditorUiAlias(propertyEditorUiAlias); this.observe(source, (dataTypes) => { + console.log('observe got', dataTypes); this._dataTypes = dataTypes; }); } private _handleClick(dataType: FolderTreeItemResponseModel) { if (dataType.id) { - this._select(dataType.id); + this.modalHandler?.submit({ dataTypeId: dataType.id }); } } - private _select(alias: string) { - this._selection = [alias]; - } - private _close() { this.modalHandler?.reject(); } @property({ attribute: false }) - modalHandler?: UmbModalHandler; - - private _submit() { - this.modalHandler?.submit({ selection: this._selection }); - } + modalHandler?: UmbModalHandler< + UmbDataTypePickerFlowDataTypePickerModalData, + UmbDataTypePickerFlowDataTypePickerModalResult + >; render() { return html` @@ -85,7 +89,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme (dataType) => dataType.id, (dataType) => dataType.id - ? html`
  • + ? html`
  • -
  • ` - )} + ${this._dataTypePickerModalRouteBuilder + ? repeat( + uis, + (propertyEditorUI) => propertyEditorUI.alias, + (propertyEditorUI) => html`
  • + + + ${propertyEditorUI.meta.label || propertyEditorUI.name} + +
  • ` + ) + : ''} `; } @@ -242,21 +263,8 @@ export class UmbDataTypePickerFlowModalElement extends UmbLitElement { cursor: pointer; } - #item-grid .item[selected] button { - background: var(--uui-color-selected); - color: var(--uui-color-selected-contrast); - } - - #item-grid .item button { - background: none; - border: none; - cursor: pointer; + #item-grid .item uui-button { padding: var(--uui-size-space-3); - display: flex; - align-items: center; - flex-direction: column; - justify-content: center; - font-size: 0.8rem; height: 100%; width: 100%; color: var(--uui-color-interactive); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.stories.ts deleted file mode 100644 index 8e8e70e5c6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.stories.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Meta, Story } from '@storybook/web-components'; -import type { UmbDataTypePickerFlowModalElement } from './data-type-picker-flow-modal.element.js'; -import { html } from '@umbraco-cms/backoffice/external/lit'; -import type { UmbPropertyEditorUIPickerModalData } from '@umbraco-cms/backoffice/modal'; - -import './data-type-picker-flow-modal.element.js'; -import '../../../../core/components/body-layout/body-layout.element.js'; - -export default { - title: 'API/Modals/Layouts/Data Type Picker Flow', - component: 'umb-data-type-picker-flow-modal', - id: 'umb-data-type-picker-flow-modal', -} as Meta; - -const data: UmbPropertyEditorUIPickerModalData = { selection: [] }; - -export const Overview: Story = () => html` - -`; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.repository.ts index 47fddbef00..959ba64508 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.repository.ts @@ -188,10 +188,10 @@ export class UmbDataTypeRepository return this.#detailStore!.byId(id); } - async treeItemsByPropertyEditorUiAlias(propertyEditorUiAlias: string) { + async byPropertyEditorUiAlias(propertyEditorUiAlias: string) { if (!propertyEditorUiAlias) throw new Error('propertyEditorUiAlias is missing'); await this.#init; - return this.#treeStore!.withPropertyEditorUiAlias(propertyEditorUiAlias); + return this.#detailStore!.withPropertyEditorUiAlias(propertyEditorUiAlias); } async create(dataType: CreateDataTypeRequestModel) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.store.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.store.ts index 76e2c0e20c..fb7fb3249e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.store.ts @@ -52,4 +52,11 @@ export class UmbDataTypeStore extends UmbStoreBase { remove(uniques: Array) { this._data.remove(uniques); } + + withPropertyEditorUiAlias(propertyEditorUiAlias: string) { + // TODO: Use a model for the data-type tree items: ^^Most likely it should be parsed to the UmbEntityTreeStore as a generic type. + return this._data.getObservablePart((items) => + items.filter((item) => (item as any).propertyEditorUiAlias === propertyEditorUiAlias) + ); + } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.tree.store.ts index 63e5170482..d2dc4686d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/repository/data-type.tree.store.ts @@ -18,15 +18,6 @@ export class UmbDataTypeTreeStore extends UmbEntityTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_DATA_TYPE_TREE_STORE_CONTEXT_TOKEN.toString()); } - - withPropertyEditorUiAlias(propertyEditorUiAlias: string) { - // TODO: Use a model for the data-type tree items: ^^Most likely it should be parsed to the UmbEntityTreeStore as a generic type. - return this._data.getObservablePart((item) => { - if ((item as any).propertyEditorUiAlias === propertyEditorUiAlias) { - return item; - } - }); - } } export const UMB_DATA_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDataTypeTreeStore'); From ea70c3e87133b55e7973774f12b216cdcaa3e997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 1 Jun 2023 14:24:12 +0200 Subject: [PATCH 05/49] clean up --- .../data-type-picker-flow-data-type-picker-modal.element.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index 2453deff5b..ab69e3ff75 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -49,7 +49,6 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme // TODO: Use the asObservable from above onces end-point has been made. const source = await dataTypeRepository.byPropertyEditorUiAlias(propertyEditorUiAlias); this.observe(source, (dataTypes) => { - console.log('observe got', dataTypes); this._dataTypes = dataTypes; }); } From 14fbf4c26f40bd22538e2587e9380de463af0f8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 1 Jun 2023 19:43:18 +0200 Subject: [PATCH 06/49] initial work for workspace modal --- .../src/packages/core/index.ts | 2 + ...icker-flow-data-type-picker-modal.token.ts | 2 +- .../src/packages/core/modal/token/index.ts | 1 + .../core/modal/token/workspace-modal.token.ts | 16 ++++++++ .../src/packages/core/workspace/index.ts | 1 + .../src/packages/core/workspace/manifests.ts | 3 ++ .../core/workspace/workspace-modal/index.ts | 1 + .../workspace/workspace-modal/manifests.ts | 10 +++++ .../workspace-modal.element.ts | 39 +++++++++++++++++++ ...ker-flow-data-type-picker-modal.element.ts | 20 +++++++++- .../data-type-picker-flow-modal.element.ts | 23 ++++++++++- .../workspace/data-type-workspace.element.ts | 4 +- .../data-types/workspace/manifests.ts | 1 + 13 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/modal/token/workspace-modal.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 0663c36adf..6fa977e957 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -2,6 +2,7 @@ import { UmbBackofficeNotificationContainerElement, UmbBackofficeModalContainerE import { manifests as debugManifests } from './debug/manifests.js'; import { manifests as propertyActionManifests } from './property-actions/manifests.js'; import { manifests as propertyEditorManifests } from './property-editors/manifests.js'; +import { manifests as workspaceManifests } from './workspace/manifests.js'; import { manifests as modalManifests } from './modal/common/manifests.js'; import { UmbStoreExtensionInitializer } from './store/index.js'; @@ -37,6 +38,7 @@ const manifests: Array = [ ...debugManifests, ...propertyActionManifests, ...propertyEditorManifests, + ...workspaceManifests, ...modalManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts index c86745bf55..4c21b1c8b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/data-type-picker-flow-data-type-picker-modal.token.ts @@ -6,7 +6,7 @@ export interface UmbDataTypePickerFlowDataTypePickerModalData { export type UmbDataTypePickerFlowDataTypePickerModalResult = { dataTypeId?: string; - createNew?: boolean; + createNewWithPropertyEditorUiAlias?: string; }; export const UMB_DATA_TYPE_PICKER_FLOW_DATA_TYPE_PICKER_MODAL = new UmbModalToken< diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts index 668ebab189..0c5dfd5cb9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/index.ts @@ -29,5 +29,6 @@ export * from './folder-modal.token.js'; export * from './partial-view-picker-modal.token.js'; export * from './dictionary-item-picker-modal.token.js'; export * from './data-type-picker-modal.token.js'; +export * from './workspace-modal.token.js'; export * from './data-type-picker-flow-modal.token.js'; export * from './data-type-picker-flow-data-type-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/workspace-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/workspace-modal.token.ts new file mode 100644 index 0000000000..46523ee4b1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/workspace-modal.token.ts @@ -0,0 +1,16 @@ +import { CreateDataTypeRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbWorkspaceData { + entityType: string; + preset: Partial; +} + +export type UmbWorkspaceResult = { + id: string; +}; + +export const UMB_WORKSPACE_MODAL = new UmbModalToken('Umb.Modal.Workspace', { + type: 'sidebar', + size: 'large', +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts index ae6add6c58..07497983cb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts @@ -2,6 +2,7 @@ export * from './workspace-action/index.js'; export * from './workspace-action-menu/index.js'; export * from './workspace-editor/index.js'; export * from './workspace-footer/index.js'; +export * from './workspace-modal/index.js'; export * from './workspace-context/index.js'; export * from './workspace-variant/index.js'; export * from './workspace-split-view-manager.class.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/manifests.ts new file mode 100644 index 0000000000..0f7b8c89ac --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as workspaceModals } from './workspace-modal/manifests.js'; + +export const manifests = [...workspaceModals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/index.ts new file mode 100644 index 0000000000..c5c54c9ab0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/index.ts @@ -0,0 +1 @@ +export * from './workspace-modal.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/manifests.ts new file mode 100644 index 0000000000..4d7e841c95 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/manifests.ts @@ -0,0 +1,10 @@ +import { ManifestModal } from '@umbraco-cms/backoffice/extension-registry'; + +const workspaceModal: ManifestModal = { + type: 'modal', + alias: 'Umb.Modal.Workspace', + name: 'Workspace Modal', + loader: () => import('./workspace-modal.element.js'), +}; + +export const manifests = [workspaceModal]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts new file mode 100644 index 0000000000..113618636a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts @@ -0,0 +1,39 @@ +import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; +import { css, CSSResultGroup, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbModalHandler, UmbWorkspaceData } from '@umbraco-cms/backoffice/modal'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +@customElement('umb-workspace-modal') +export class UmbWorkspaceModalElement extends UmbLitElement { + @property({ attribute: false }) + modalHandler?: UmbModalHandler; + + @property() + data?: UmbWorkspaceData; + + private _close() { + this.modalHandler?.submit(); + } + + render() { + return html`WORKSPACE MODAL, TBD`; + } + + static styles: CSSResultGroup = [ + UUITextStyles, + css` + :host { + display: block; + width: 400px; + } + `, + ]; +} + +export default UmbWorkspaceModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-workspace-modal': UmbWorkspaceModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index ab69e3ff75..effc3ccab6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -17,12 +17,16 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme @state() private _dataTypes?: Array; + private _propertyEditorUiAlias!: string; + connectedCallback(): void { super.connectedCallback(); if (!this.data) return; - this._observeDataTypesOf(this.data.propertyEditorUiAlias); + this._propertyEditorUiAlias = this.data.propertyEditorUiAlias; + + this._observeDataTypesOf(this._propertyEditorUiAlias); } private async _observeDataTypesOf(propertyEditorUiAlias: string) { @@ -59,6 +63,10 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme } } + private _handleCreate() { + this.modalHandler?.submit({ createNewWithPropertyEditorUiAlias: this._propertyEditorUiAlias }); + } + private _close() { this.modalHandler?.reject(); } @@ -72,7 +80,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme render() { return html` - ${this._renderDataTypes()} + ${this._renderDataTypes()} ${this._renderCreate()}
    @@ -99,6 +107,14 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbLitEleme : ''} `; } + private _renderCreate() { + return html`
  • + +
  • `; + } static styles = [ UUITextStyles, diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index 7d1b4f0ab5..059f8da7dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -5,6 +5,7 @@ import { groupBy } from '@umbraco-cms/backoffice/external/lodash'; import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { UMB_DATA_TYPE_PICKER_FLOW_DATA_TYPE_PICKER_MODAL, + UMB_WORKSPACE_MODAL, UmbDataTypePickerFlowModalData, UmbDataTypePickerFlowModalResult, UmbModalHandler, @@ -49,6 +50,8 @@ export class UmbDataTypePickerFlowModalElement extends UmbLitElement { @state() private _dataTypePickerModalRouteBuilder?: UmbModalRouteBuilder; + private _createDataTypeModal: UmbModalRouteRegistrationController; + #repository; #dataTypes: Array = []; #propertyEditorUIs: Array = []; @@ -68,16 +71,34 @@ export class UmbDataTypePickerFlowModalElement extends UmbLitElement { }; }) .onSubmit((submitData) => { - console.log('got', submitData); + if (submitData.dataTypeId) { + this._select(submitData.dataTypeId); + } else if (submitData.createNewWithPropertyEditorUiAlias) { + this._createDataType(submitData.createNewWithPropertyEditorUiAlias); + } }) .observeRouteBuilder((routeBuilder) => { this._dataTypePickerModalRouteBuilder = routeBuilder; this.requestUpdate('_dataTypePickerModalRouteBuilder'); }); + this._createDataTypeModal = new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + .addAdditionalPath(':uiAlias') + .onSetup((params) => { + return { entityType: 'data-type', preset: { propertyEditorUiAlias: params.uiAlias } }; + }) + .onSubmit((submitData) => { + console.log('submitData', submitData); + }); + this.#init(); } + private _createDataType(propertyEditorUiAlias: string) { + // Open create modal: + this._createDataTypeModal.open({ uiAlias: propertyEditorUiAlias }); + } + async #init() { // TODO: Get ALL items, or traverse the structure aka. multiple recursive calls. this.observe( diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.element.ts index 807a60aa58..599fba0f18 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.element.ts @@ -1,6 +1,6 @@ import { UmbDataTypeWorkspaceContext } from './data-type-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -36,7 +36,7 @@ export class UmbDataTypeWorkspaceElement extends UmbLitElement { return html``; } - static styles = [UUITextStyles, css``]; + static styles = [UUITextStyles]; } export default UmbDataTypeWorkspaceElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/manifests.ts index 6732de2659..a1d3852160 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/manifests.ts @@ -1,5 +1,6 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { + ManifestModal, ManifestWorkspace, ManifestWorkspaceAction, ManifestWorkspaceEditorView, From be8ccba00b9a2de80991cf53ab4c3a4876cb33e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 1 Jun 2023 22:14:17 +0200 Subject: [PATCH 07/49] more work + todo for next step --- .../workspace/workspace-modal/workspace-modal.element.ts | 7 ++++++- .../src/packages/core/workspace/workspace.element.ts | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts index 113618636a..9c30ee0dc8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts @@ -15,8 +15,13 @@ export class UmbWorkspaceModalElement extends UmbLitElement { this.modalHandler?.submit(); } + /** + * TODO: + * It seems like the router-slot cannot find the right parent router-slot as the modal element is injected via a slot. and therefor its search through parentNodes would never get to the router-slot cause its DOM existance is not within the slot, thats only the rendering. + * We can fix this by changing the router-slot to use an event to find its parent. + */ render() { - return html`WORKSPACE MODAL, TBD`; + return html``; } static styles: CSSResultGroup = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace.element.ts index 3d1eb0a531..d6ed14cf62 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace.element.ts @@ -1,5 +1,5 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, nothing , customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; @@ -9,7 +9,7 @@ export class UmbWorkspaceElement extends UmbLitElement { entityType = ''; render() { - if (!this.entityType) nothing; + if (!this.entityType) return nothing; return html` manifest.meta.entityType === this.entityType}>`; From 2876f96c84435cb33a9ea6ba7462b36a11b3dbf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 2 Jun 2023 14:18:31 +0200 Subject: [PATCH 08/49] new router-slot version --- src/Umbraco.Web.UI.Client/package-lock.json | 8 ++++---- src/Umbraco.Web.UI.Client/package.json | 2 +- src/Umbraco.Web.UI.Client/router-slot-2.2.0.tgz | Bin 26745 -> 0 bytes src/Umbraco.Web.UI.Client/router-slot-2.3.0.tgz | Bin 0 -> 26896 bytes 4 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/router-slot-2.2.0.tgz create mode 100644 src/Umbraco.Web.UI.Client/router-slot-2.3.0.tgz diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 05fe4b0edb..a6302cf49d 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -16,7 +16,7 @@ "lit": "^2.7.4", "lodash-es": "4.17.21", "monaco-editor": "^0.36.1", - "router-slot": "file:router-slot-2.2.0.tgz", + "router-slot": "file:router-slot-2.3.0.tgz", "rxjs": "^7.8.0", "uuid": "^9.0.0" }, @@ -18065,9 +18065,9 @@ "dev": true }, "node_modules/router-slot": { - "version": "2.2.0", - "resolved": "file:router-slot-2.2.0.tgz", - "integrity": "sha512-AAFrwU5Hr9p8Qb1NRIjO2z2IK/VU5SCobaXcboOq9zmfSr990oCKEpDF62t/Ij9P78+jR9fWxcIl7Tdc9Wx0ng==", + "version": "2.3.0", + "resolved": "file:router-slot-2.3.0.tgz", + "integrity": "sha512-bH3g1/xOwbkuwE4iQ0tLwp1/r+dqttQr/ezO0tzp+KCttsCcxxgSCbEYy8+ePuSCLsiS3WhuTfFSED74d+tMjg==", "license": "MIT" }, "node_modules/run-applescript": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index f34a5b3e9b..dd79592d60 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -109,7 +109,7 @@ "lit": "^2.7.4", "lodash-es": "4.17.21", "monaco-editor": "^0.36.1", - "router-slot": "file:router-slot-2.2.0.tgz", + "router-slot": "file:router-slot-2.3.0.tgz", "rxjs": "^7.8.0", "uuid": "^9.0.0" }, diff --git a/src/Umbraco.Web.UI.Client/router-slot-2.2.0.tgz b/src/Umbraco.Web.UI.Client/router-slot-2.2.0.tgz deleted file mode 100644 index dac0dca44721ab5c8ab56fa854a41c6078aa8b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26745 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 diff --git a/src/Umbraco.Web.UI.Client/router-slot-2.3.0.tgz b/src/Umbraco.Web.UI.Client/router-slot-2.3.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..af84cfe3d3758ef37cb7898555395b364df2b5a1 GIT binary patch literal 26896 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 bsa!AL>(BM)`g8sH>;3%y*9l4701^TKBQLKq literal 0 HcmV?d00001 From d465ae2da1a224155b28fbafd60484b5739f5835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 2 Jun 2023 14:18:37 +0200 Subject: [PATCH 09/49] styling --- .../core/workspace/workspace-modal/workspace-modal.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts index 9c30ee0dc8..4ba8d9dd10 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts @@ -29,7 +29,7 @@ export class UmbWorkspaceModalElement extends UmbLitElement { css` :host { display: block; - width: 400px; + height: 100%; } `, ]; From a8561ecc0d7290d67691e96715e063e595c9cfe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 2 Jun 2023 20:58:17 +0200 Subject: [PATCH 10/49] modal handler cleanup --- .../src/packages/core/modal/modal-handler.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-handler.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-handler.ts index 2c040489dd..1a2737b203 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-handler.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-handler.ts @@ -186,13 +186,6 @@ export class UmbModalHandlerClass Date: Fri, 2 Jun 2023 21:01:22 +0200 Subject: [PATCH 11/49] correct cleanup --- .../src/packages/core/modal/modal-handler.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-handler.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-handler.ts index 1a2737b203..d08c08e4c3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-handler.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-handler.ts @@ -171,14 +171,13 @@ export class UmbModalHandlerClass { + this.#removeInnerElement(); if (manifest) { const innerElement = await this.#createInnerElement(manifest, data); if (innerElement) { this.#appendInnerElement(innerElement); - return; } } - this.#removeInnerElement(); } ); } From 0a1da061a48cba471557ef21f168e7382ccced2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 2 Jun 2023 21:48:07 +0200 Subject: [PATCH 12/49] prepend to URL when open a modal --- .../src/packages/core/modal/modal-route-registration.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-route-registration.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-route-registration.ts index d9a17ce870..a530c6176e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-route-registration.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-route-registration.ts @@ -65,10 +65,10 @@ export class UmbModalRouteRegistration Date: Fri, 2 Jun 2023 22:07:36 +0200 Subject: [PATCH 13/49] provide focus to name when new --- .../data-type-workspace-editor.element.ts | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts index 0fdd38475d..f0a8179dd6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts @@ -23,10 +23,29 @@ export class UmbDataTypeWorkspaceEditorElement extends UmbLitElement { this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { this.#workspaceContext = workspaceContext as UmbDataTypeWorkspaceContext; + this.#observeIsNew(); this.#observeName(); }); } + // TODO: invent some general way for all workspaces, with a name?, to put focus on the name when new. + #observeIsNew() { + if (!this.#workspaceContext) return; + this.observe( + this.#workspaceContext.isNew, + (isNew) => { + if (isNew) { + // TODO: Make a general way to put focus on a input in a modal. (also make sure it only happens if its the top-most-modal.) + requestAnimationFrame(() => { + (this.shadowRoot!.querySelector('#nameInput') as HTMLElement).focus(); + }); + } + this.removeControllerByUnique('_observeIsNew'); + }, + '_observeIsNew' + ); + } + #observeName() { if (!this.#workspaceContext) return; this.observe(this.#workspaceContext.name, (dataTypeName) => { @@ -50,7 +69,7 @@ export class UmbDataTypeWorkspaceEditorElement extends UmbLitElement { render() { return html` - + `; } @@ -64,7 +83,7 @@ export class UmbDataTypeWorkspaceEditorElement extends UmbLitElement { height: 100%; } - #header { + #nameInput { /* TODO: can this be applied from layout slot CSS? */ margin: 0 var(--uui-size-layout-1); flex: 1 1 auto; From 72bc321d9241edc4660b0df8bcebeb7ff4db7309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 2 Jun 2023 22:08:56 +0200 Subject: [PATCH 14/49] ability to set a preset --- .../workspace/data-type-workspace.context.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index e56e1bc889..726b8ab7d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -12,6 +12,8 @@ export class UmbDataTypeWorkspaceContext #data = new UmbObjectState(undefined); data = this.#data.asObservable(); + #preset?: Partial; + name = this.#data.getObservablePart((data) => data?.name); id = this.#data.getObservablePart((data) => data?.id); @@ -19,6 +21,10 @@ export class UmbDataTypeWorkspaceContext super(host, new UmbDataTypeRepository(host)); } + public setPreset(preset: Partial) { + this.#preset = preset; + } + async load(id: string) { const { data } = await this.repository.requestById(id); if (data) { @@ -28,7 +34,10 @@ export class UmbDataTypeWorkspaceContext } async createScaffold(parentId: string | null) { - const { data } = await this.repository.createScaffold(parentId); + let { data } = await this.repository.createScaffold(parentId); + if (this.#preset) { + data = { ...data, ...this.#preset }; + } this.setIsNew(true); // TODO: This is a hack to get around the fact that the data is not typed correctly. // Create and response models are different. We need to look into this. @@ -80,8 +89,8 @@ export class UmbDataTypeWorkspaceContext } else { await this.repository.save(this.#data.value.id, this.#data.value); } - // If it went well, then its not new anymore?. - this.setIsNew(false); + + this.saveComplete(this.#data.value); } async delete(id: string) { From afe51436fa0d26adab6d0c6a85c3e5e720c2f6c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 2 Jun 2023 22:17:29 +0200 Subject: [PATCH 15/49] remove comments --- .../src/packages/core/modal/modal.context.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal.context.ts index d3dd5cadec..32fa0c7fbf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal.context.ts @@ -15,8 +15,6 @@ export interface UmbModalConfig { size?: UUIModalSidebarSize; } -// TODO: we should find a way to easily open a modal without adding custom methods to this context. It would result in a better separation of concerns. -// TODO: move all layouts into their correct "silo" folders. User picker should live with users etc. export class UmbModalContext { host: UmbControllerHostElement; // TODO: Investigate if we can get rid of HTML elements in our store, so we can use one of our states. From 92bdc2756f06b9feee28f988bc220b46efbad879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 2 Jun 2023 22:36:18 +0200 Subject: [PATCH 16/49] binding and events approach --- .../workspace-context/workspace-context.ts | 8 ++++++ .../workspace-modal.element.ts | 25 +++++++++++-------- .../core/workspace/workspace.element.ts | 4 +++ .../data-type-picker-flow-modal.element.ts | 3 ++- .../workspace/data-type-workspace.element.ts | 11 +++++--- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts index 0362130fe2..6285456d7f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts @@ -33,6 +33,14 @@ export abstract class UmbWorkspaceContext this.#isNew.next(isNew); } + protected saveComplete(data: EntityType) { + // TODO: Should we make a Event class for this=? + this.host.dispatchEvent(new CustomEvent('workspace-submit', { composed: true, bubbles: true, detail: { data } })); + + // If it went well, then its not new anymore?. + this.setIsNew(false); + } + abstract getEntityId(): string | undefined; // COnsider if this should go away now that we have getUnique() abstract getEntityType(): string; // TODO: consider of this should be on the repository because a repo is responsible for one entity type abstract getData(): EntityType | undefined; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts index 4ba8d9dd10..42f4b9fd95 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts @@ -1,6 +1,6 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, CSSResultGroup, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalHandler, UmbWorkspaceData } from '@umbraco-cms/backoffice/modal'; +import { UmbModalHandler, UmbWorkspaceData, UmbWorkspaceResult } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-workspace-modal') @@ -11,17 +11,22 @@ export class UmbWorkspaceModalElement extends UmbLitElement { @property() data?: UmbWorkspaceData; - private _close() { - this.modalHandler?.submit(); - } + private _reject = (event: CustomEvent) => { + event.stopPropagation(); + this.modalHandler?.reject(); + }; + + private _submit = (event: CustomEvent) => { + event.stopPropagation(); + this.modalHandler?.submit(event.detail); + }; - /** - * TODO: - * It seems like the router-slot cannot find the right parent router-slot as the modal element is injected via a slot. and therefor its search through parentNodes would never get to the router-slot cause its DOM existance is not within the slot, thats only the rendering. - * We can fix this by changing the router-slot to use an event to find its parent. - */ render() { - return html``; + return html``; } static styles: CSSResultGroup = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace.element.ts index d6ed14cf62..a6521513b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace.element.ts @@ -8,10 +8,14 @@ export class UmbWorkspaceElement extends UmbLitElement { @property({ type: String, attribute: 'entity-type' }) entityType = ''; + @property({ type: Object, attribute: false }) + preset?: Record; + render() { if (!this.entityType) return nothing; return html` manifest.meta.entityType === this.entityType}>`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index 059f8da7dc..15606fd649 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -95,8 +95,9 @@ export class UmbDataTypePickerFlowModalElement extends UmbLitElement { } private _createDataType(propertyEditorUiAlias: string) { + // TODO: Could be nice with a more pretty way to prepend to the URL: // Open create modal: - this._createDataTypeModal.open({ uiAlias: propertyEditorUiAlias }); + this._createDataTypeModal.open({ uiAlias: propertyEditorUiAlias }, 'create/null'); } async #init() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.element.ts index 599fba0f18..5e6ffcb816 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.element.ts @@ -1,10 +1,11 @@ import { UmbDataTypeWorkspaceContext } from './data-type-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './data-type-workspace-editor.element.js'; +import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-data-type-workspace') export class UmbDataTypeWorkspaceElement extends UmbLitElement { @@ -12,8 +13,12 @@ export class UmbDataTypeWorkspaceElement extends UmbLitElement { #element = document.createElement('umb-data-type-workspace-editor'); - @state() - _routes: UmbRoute[] = [ + @property({ type: Object, attribute: false }) + public set preset(value: Partial) { + this.#workspaceContext.setPreset(value); + } + + private _routes: UmbRoute[] = [ { path: 'create/:parentId', component: () => this.#element, From e65a77644b6706c2ce7dafc43e0997c24d2c53da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 5 Jun 2023 09:31:19 +0200 Subject: [PATCH 17/49] rename to modal manager context --- .../backoffice-modal-container.element.ts | 10 +++++--- .../input-list-base/input-list-base.ts | 8 +++---- .../src/packages/core/debug/debug.element.ts | 10 +++++--- .../delete-folder/delete-folder.action.ts | 10 +++++--- .../common/delete/delete.action.ts | 10 +++++--- .../folder-update/folder-update.action.ts | 10 +++++--- .../common/trash/trash.action.ts | 10 +++++--- .../src/packages/core/index.ts | 4 ++-- .../core/modal/modal-route-registration.ts | 4 ++-- .../src/packages/core/modal/modal.context.ts | 4 ++-- .../core/picker-input/picker-input.context.ts | 16 ++++++------- .../property-editor-ui-icon-picker.element.ts | 12 ++++++---- ...input-multiple-text-string-item.element.ts | 12 ++++++---- .../workspace-modal.element.ts | 4 ++++ .../dashboard-redirect-management.element.ts | 10 +++++--- .../input-document-type-picker.element.ts | 8 +++---- .../entity-actions/create/create.action.ts | 12 +++++----- ...ument-type-create-options-modal.element.ts | 8 +++---- .../document-type-workspace-editor.element.ts | 10 +++++--- ...-workspace-view-edit-properties.element.ts | 8 +++---- .../input-document-picker.element.ts | 8 +++---- .../entity-actions/create/create.action.ts | 8 +++---- .../input-media-picker.element.ts | 8 +++---- .../entity-bulk-actions/move/move.action.ts | 10 +++++--- .../entity-bulk-actions/trash/trash.action.ts | 10 +++++--- .../packages-created-overview.element.ts | 10 +++++--- ...lled-packages-section-view-item.element.ts | 12 ++++++---- .../views/section-view-examine-indexers.ts | 10 +++++--- .../views/section-view-examine-searchers.ts | 10 ++++---- .../search/umb-search-header-app.element.ts | 8 +++---- .../dashboard-published-status.element.ts | 10 +++++--- .../entity-actions/copy/copy.action.ts | 16 ++++++++----- .../entity-actions/create/create.action.ts | 12 +++++----- .../data-type-create-options-modal.element.ts | 10 ++++---- .../entity-actions/move/move.action.ts | 16 ++++++++----- ...ata-type-details-workspace-view.element.ts | 8 +++---- .../extension-root-workspace.element.ts | 12 ++++++---- .../log-viewer-search-input.element.ts | 18 +++++++++----- .../templating-insert-menu.element.ts | 14 +++++------ .../insert-choose-type-sidebar.element.ts | 14 ++++------- .../input-template/input-template.element.ts | 10 ++++---- .../template-workspace-editor.element.ts | 10 +++++--- ...ashboard-translation-dictionary.element.ts | 10 +++++--- .../entity-actions/create/create.action.ts | 10 +++++--- .../entity-actions/export/export.action.ts | 10 +++++--- .../entity-actions/import/import.action.ts | 10 +++++--- .../current-user-header-app.element.ts | 12 ++++++---- .../user-profile-app-profile.element.ts | 12 ++++++---- .../delete/delete.action.ts | 10 +++++--- .../user-group-workspace-editor.element.ts | 10 +++++--- .../user-collection-header.element.ts | 13 +++++----- .../delete/delete.action.ts | 10 +++++--- .../set-group/set-group.action.ts | 6 ++--- .../user-workspace-editor.element.ts | 4 ++-- .../src/shared/modal/stories/modal.mdx | 24 +++++++++---------- .../story-modal-service-example.element.ts | 8 +++---- .../src/shared/router/route.context.ts | 6 ++--- 57 files changed, 351 insertions(+), 228 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-modal-container/backoffice-modal-container.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-modal-container/backoffice-modal-container.element.ts index 950825cb99..2e028b6326 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-modal-container/backoffice-modal-container.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-modal-container/backoffice-modal-container.element.ts @@ -1,6 +1,10 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, CSSResultGroup, html, repeat, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalHandler, UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalHandler, + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, +} from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-backoffice-modal-container') @@ -8,12 +12,12 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { @state() private _modals?: UmbModalHandler[]; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; this._observeModals(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts index 5e6036bd1e..64217dd35c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts @@ -1,10 +1,10 @@ import { html, property } from '@umbraco-cms/backoffice/external/lit'; import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; import { - UmbModalContext, + UmbModalManagerContext, UmbModalToken, UmbModalType, - UMB_MODAL_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbPickerModalResult, } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -25,11 +25,11 @@ export class UmbInputListBaseElement extends UmbLitElement { // TODO: not great that we use any, any here. Investigate if we can have some interface or base modal token for this type. protected pickerToken?: UmbModalToken; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/debug/debug.element.ts index f9e8b29621..1d549eec3b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/debug/debug.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/debug/debug.element.ts @@ -16,7 +16,11 @@ import { UmbContextDebugRequest, } from '@umbraco-cms/backoffice/context-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalContext, UMB_CONTEXT_DEBUGGER_MODAL, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_CONTEXT_DEBUGGER_MODAL, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, +} from '@umbraco-cms/backoffice/modal'; @customElement('umb-debug') export class UmbDebugElement extends UmbLitElement { @@ -32,11 +36,11 @@ export class UmbDebugElement extends UmbLitElement { @state() private _debugPaneOpen = false; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete-folder/delete-folder.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete-folder/delete-folder.action.ts index c88392abfb..4f17498762 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete-folder/delete-folder.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete-folder/delete-folder.action.ts @@ -1,16 +1,20 @@ import { UmbEntityActionBase } from '../../entity-action.js'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbFolderRepository } from '@umbraco-cms/backoffice/repository'; export class UmbDeleteFolderEntityAction extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts index 11d43207cd..79755bc398 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts @@ -1,18 +1,22 @@ import { UmbEntityActionBase } from '../../entity-action.js'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbDetailRepository, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; export class UmbDeleteEntityAction< T extends UmbDetailRepository & UmbItemRepository > extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/folder-update/folder-update.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/folder-update/folder-update.action.ts index cd3916541c..8b98061e69 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/folder-update/folder-update.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/folder-update/folder-update.action.ts @@ -1,18 +1,22 @@ import { UmbEntityActionBase } from '../../entity-action.js'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbModalContext, UMB_FOLDER_MODAL, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_FOLDER_MODAL, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, +} from '@umbraco-cms/backoffice/modal'; import { UmbFolderRepository } from '@umbraco-cms/backoffice/repository'; export class UmbFolderUpdateEntityAction< T extends UmbFolderRepository = UmbFolderRepository > extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts index 0429e455d3..bed68c00a9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts @@ -1,18 +1,22 @@ import { UmbEntityActionBase } from '../../entity-action.js'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; export class UmbTrashEntityAction< T extends UmbItemRepository & { trash(unique: Array): Promise } > extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 6fa977e957..1f3d426742 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -7,7 +7,7 @@ import { manifests as modalManifests } from './modal/common/manifests.js'; import { UmbStoreExtensionInitializer } from './store/index.js'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; import type { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api'; import { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; @@ -54,5 +54,5 @@ export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { host.appendChild(modalContainerElement); new UmbContextProviderController(host, UMB_NOTIFICATION_CONTEXT_TOKEN, new UmbNotificationContext()); - new UmbContextProviderController(host, UMB_MODAL_CONTEXT_TOKEN, new UmbModalContext(host)); + new UmbContextProviderController(host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, new UmbModalManagerContext(host)); }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-route-registration.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-route-registration.ts index a530c6176e..77e362bb8f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-route-registration.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/modal-route-registration.ts @@ -1,5 +1,5 @@ import { UmbModalHandler } from './modal-handler.js'; -import { UmbModalConfig, UmbModalContext } from './modal.context.js'; +import { UmbModalConfig, UmbModalManagerContext } from './modal.context.js'; import { UmbModalToken } from './token/modal-token.js'; import type { IRouterSlot } from '@umbraco-cms/backoffice/external/router-slot'; import { encodeFolderName } from '@umbraco-cms/backoffice/router'; @@ -109,7 +109,7 @@ export class UmbModalRouteRegistration>[]); @@ -85,4 +85,4 @@ export class UmbModalContext { } } -export const UMB_MODAL_CONTEXT_TOKEN = new UmbContextToken('UmbModalContext'); +export const UMB_MODAL_MANAGER_CONTEXT_TOKEN = new UmbContextToken('UmbModalManagerContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts index 2f6f163fe2..7d86d9472f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts @@ -2,8 +2,8 @@ import { UmbItemRepository, UmbRepositoryItemsManager } from '@umbraco-cms/backo import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UMB_CONFIRM_MODAL, - UMB_MODAL_CONTEXT_TOKEN, - UmbModalContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UmbModalManagerContext, UmbModalToken, UmbPickerModalData, } from '@umbraco-cms/backoffice/modal'; @@ -17,7 +17,7 @@ export class UmbPickerInputContext repository?: UmbItemRepository; #getUnique: (entry: ItemType) => string | undefined; - public modalContext?: UmbModalContext; + public modalManager?: UmbModalManagerContext; public pickableFilter?: (item: ItemType) => boolean = () => true; @@ -50,8 +50,8 @@ export class UmbPickerInputContext this.#init = Promise.all([ this.#itemManager.init, - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { - this.modalContext = instance; + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.modalManager = instance; }).asPromise(), ]); } @@ -66,9 +66,9 @@ export class UmbPickerInputContext // TODO: If modalAlias is a ModalToken, then via TS, we should get the correct type for pickerData. Otherwise fallback to unknown. openPicker(pickerData?: Partial>) { - if (!this.modalContext) throw new Error('Modal context is not initialized'); + if (!this.modalManager) throw new Error('Modal manager context is not initialized'); - const modalHandler = this.modalContext.open(this.modalAlias, { + const modalHandler = this.modalManager.open(this.modalAlias, { multiple: this.max === 1 ? false : true, selection: [...this.getSelection()], pickableFilter: this.pickableFilter, @@ -90,7 +90,7 @@ export class UmbPickerInputContext const item = this.#itemManager.getItems().find((item) => this.#getUnique(item) === unique); if (!item) throw new Error('Could not find item with unique: ' + unique); - const modalHandler = this.modalContext?.open(UMB_CONFIRM_MODAL, { + const modalHandler = this.modalManager?.open(UMB_CONFIRM_MODAL, { color: 'danger', headline: `Remove ${item.name}?`, content: 'Are you sure you want to remove this item', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts index f44416d188..cbe44fae8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts @@ -1,7 +1,11 @@ -import { html , customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_ICON_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbDataTypePropertyCollection } from '@umbraco-cms/backoffice/components'; @@ -16,11 +20,11 @@ export class UmbPropertyEditorUIIconPickerElement extends UmbLitElement implemen @property({ type: Array, attribute: false }) public config?: UmbDataTypePropertyCollection; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editors/uis/multiple-text-string/input-multiple-text-string-item/input-multiple-text-string-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editors/uis/multiple-text-string/input-multiple-text-string-item/input-multiple-text-string-item.element.ts index 71dd28f03d..bf54c74d03 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editors/uis/multiple-text-string/input-multiple-text-string-item/input-multiple-text-string-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editors/uis/multiple-text-string/input-multiple-text-string-item/input-multiple-text-string-item.element.ts @@ -1,6 +1,10 @@ -import { css, html, nothing , customElement, property, query } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, nothing, customElement, property, query } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles, FormControlMixin, UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbChangeEvent, UmbInputEvent, UmbDeleteEvent } from '@umbraco-cms/backoffice/events'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -30,12 +34,12 @@ export class UmbInputMultipleTextStringItemElement extends FormControlMixin(UmbL @query('#input') protected _input?: UUIInputElement; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts index 42f4b9fd95..3056ad5fd5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-modal/workspace-modal.element.ts @@ -21,6 +21,10 @@ export class UmbWorkspaceModalElement extends UmbLitElement { this.modalHandler?.submit(event.detail); }; + /** + * TODO: Consider if this binding and events integration is the right for communicating back the modal handler. Or if we should go with some Context API. like a Modal Context API. + * + */ render() { return html` { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (_instance) => { this._modalContext = _instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type-picker/input-document-type-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type-picker/input-document-type-picker.element.ts index 0113e7f448..7eea1cb088 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type-picker/input-document-type-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type-picker/input-document-type-picker.element.ts @@ -6,8 +6,8 @@ import { css, html, nothing, ifDefined, customElement, property, state } from '@ import { UUITextStyles, FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { DocumentTypeResponseModel, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { - UmbModalContext, - UMB_MODAL_CONTEXT_TOKEN, + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_CONFIRM_MODAL, UMB_DOCUMENT_TYPE_PICKER_MODAL, } from '@umbraco-cms/backoffice/modal'; @@ -38,7 +38,7 @@ export class UmbInputDocumentTypePickerElement extends FormControlMixin(UmbLitEl @state() private _items?: Array; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; private _documentTypeStore?: UmbDocumentTypeTreeStore; private _pickedItemsObserver?: UmbObserverController; @@ -48,7 +48,7 @@ export class UmbInputDocumentTypePickerElement extends FormControlMixin(UmbLitEl this._documentTypeStore = instance; this._observePickedDocuments(); }); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/create.action.ts index 4a4a74014a..5546938f8f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/create.action.ts @@ -2,25 +2,25 @@ import { UmbDocumentTypeRepository } from '../../repository/document-type.reposi import { UMB_DOCUMENT_TYPE_CREATE_OPTIONS_MODAL } from './modal/index.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; export class UmbCreateDataTypeEntityAction extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalManagerContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { - this.#modalContext = instance; + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.#modalManagerContext = instance; }); } async execute() { - if (!this.#modalContext) throw new Error('Modal context is not available'); + if (!this.#modalManagerContext) throw new Error('Modal manager context is not available'); if (!this.repository) throw new Error('Repository is not available'); - this.#modalContext?.open(UMB_DOCUMENT_TYPE_CREATE_OPTIONS_MODAL, { + this.#modalManagerContext?.open(UMB_DOCUMENT_TYPE_CREATE_OPTIONS_MODAL, { parentKey: this.unique, }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts index 574a3fbe4b..58cab764de 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts @@ -3,10 +3,10 @@ import { UmbDocumentTypeCreateOptionsModalData } from './index.js'; import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { - UmbModalContext, + UmbModalManagerContext, UmbModalHandler, UMB_FOLDER_MODAL, - UMB_MODAL_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -18,11 +18,11 @@ export class UmbDataTypeCreateOptionsModalElement extends UmbLitElement { @property({ type: Object }) data?: UmbDocumentTypeCreateOptionsModalData; - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace-editor.element.ts index b9e423ee7e..cbaba7fa60 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace-editor.element.ts @@ -2,7 +2,11 @@ import { UmbDocumentTypeWorkspaceContext } from './document-type-workspace.conte import { UUIInputElement, UUIInputEvent, UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_ICON_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-document-type-workspace-editor') export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { @@ -21,7 +25,7 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { @state() private _alias?: string; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); @@ -31,7 +35,7 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { this.#observeDocumentType(); }); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts index 5967b66af0..61a35ce42b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts @@ -1,5 +1,5 @@ import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context.js'; -import { css, html , customElement, property, state , repeat , ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { UmbContentTypePropertyStructureHelper, PropertyContainerTypes } from '@umbraco-cms/backoffice/content-type'; import { UmbSorterController, UmbSorterConfig } from '@umbraco-cms/backoffice/sorter'; @@ -8,7 +8,7 @@ import { DocumentTypePropertyTypeResponseModel, PropertyTypeResponseModelBaseModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_MODAL_CONTEXT_TOKEN, UMB_PROPERTY_SETTINGS_MODAL } from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_PROPERTY_SETTINGS_MODAL } from '@umbraco-cms/backoffice/modal'; import './document-type-workspace-view-edit-property.element.js'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; const SORTER_CONFIG: UmbSorterConfig = { @@ -80,7 +80,7 @@ export class UmbDocumentTypeWorkspaceViewEditPropertiesElement extends UmbLitEle @state() _propertyStructure: Array = []; - #modalContext?: typeof UMB_MODAL_CONTEXT_TOKEN.TYPE; + #modalContext?: typeof UMB_MODAL_MANAGER_CONTEXT_TOKEN.TYPE; constructor() { super(); @@ -90,7 +90,7 @@ export class UmbDocumentTypeWorkspaceViewEditPropertiesElement extends UmbLitEle (workspaceContext as UmbDocumentTypeWorkspaceContext).structure ); }); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => (this.#modalContext = instance)); + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => (this.#modalContext = instance)); this.observe(this._propertyStructureHelper.propertyStructure, (propertyStructure) => { this._propertyStructure = propertyStructure; this.#propertySorter.setModel(this._propertyStructure); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-picker/input-document-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-picker/input-document-picker.element.ts index db3992298f..45686bacd8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-picker/input-document-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-picker/input-document-picker.element.ts @@ -3,8 +3,8 @@ import type { UmbDocumentTreeStore } from '../../repository/document.tree.store. import { css, html, nothing, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles, FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { - UmbModalContext, - UMB_MODAL_CONTEXT_TOKEN, + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_CONFIRM_MODAL, UMB_DOCUMENT_PICKER_MODAL, } from '@umbraco-cms/backoffice/modal'; @@ -71,7 +71,7 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen @state() private _items?: Array; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; private _documentStore?: UmbDocumentTreeStore; private _pickedItemsObserver?: UmbObserverController; @@ -93,7 +93,7 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen this._documentStore = instance; this._observePickedDocuments(); }); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/create.action.ts index 8bf7982dc8..3454a21e02 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/create.action.ts @@ -2,19 +2,19 @@ import type { UmbDocumentRepository } from '../../repository/document.repository import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { - UmbModalContext, - UMB_MODAL_CONTEXT_TOKEN, + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_ALLOWED_DOCUMENT_TYPES_MODAL, } from '@umbraco-cms/backoffice/modal'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; export class UmbCreateDocumentEntityAction extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media-picker/input-media-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media-picker/input-media-picker.element.ts index 9822455abe..6ca46e363a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media-picker/input-media-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media-picker/input-media-picker.element.ts @@ -2,8 +2,8 @@ import { UmbMediaRepository } from '../../repository/media.repository.js'; import { css, html, nothing, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles, FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { - UmbModalContext, - UMB_MODAL_CONTEXT_TOKEN, + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_CONFIRM_MODAL, UMB_MEDIA_TREE_PICKER_MODAL, } from '@umbraco-cms/backoffice/modal'; @@ -70,7 +70,7 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) @state() private _items?: Array; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; private _pickedItemsObserver?: UmbObserverController; private _repository = new UmbMediaRepository(this); @@ -88,7 +88,7 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) () => !!this.max && this._selectedIds.length > this.max ); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/move/move.action.ts index 7cae823031..7d571a26df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/move/move.action.ts @@ -2,15 +2,19 @@ import type { UmbMediaRepository } from '../../repository/media.repository.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_MEDIA_TREE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_MEDIA_TREE_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; export class UmbMediaMoveEntityBulkAction extends UmbEntityBulkActionBase { - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); - new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/trash/trash.action.ts index 9b2f10d9d9..e1d553d141 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-bulk-actions/trash/trash.action.ts @@ -3,15 +3,19 @@ import { html } from '@umbraco-cms/backoffice/external/lit'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; export class UmbMediaTrashEntityBulkAction extends UmbEntityBulkActionBase { - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); - new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/created/packages-created-overview.element.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/created/packages-created-overview.element.ts index 66e6c6e32a..6eeb1ea67d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/created/packages-created-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/created/packages-created-overview.element.ts @@ -3,7 +3,11 @@ import { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; import { PackageDefinitionResponseModel, PackageResource } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; @customElement('umb-packages-created-overview') export class UmbPackagesCreatedOverviewElement extends UmbLitElement { @@ -21,7 +25,7 @@ export class UmbPackagesCreatedOverviewElement extends UmbLitElement { @state() private _total?: number; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); @@ -31,7 +35,7 @@ export class UmbPackagesCreatedOverviewElement extends UmbLitElement { super.connectedCallback(); this.#getPackages(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/installed/installed-packages-section-view-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/installed/installed-packages-section-view-item.element.ts index d3af6e67c8..6a91021f4e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/installed/installed-packages-section-view-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/installed/installed-packages-section-view-item.element.ts @@ -1,7 +1,11 @@ -import { html, css, nothing , ifDefined , customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, css, nothing, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import { ManifestPackageView, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -40,7 +44,7 @@ export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement { private _packageView?: ManifestPackageView; #notificationContext?: UmbNotificationContext; - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor() { super(); @@ -48,7 +52,7 @@ export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement { this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { this.#notificationContext = instance; }); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-indexers.ts b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-indexers.ts index bb89ff057f..38e2abce4b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-indexers.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-indexers.ts @@ -1,6 +1,10 @@ import { UUITextStyles, UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { HealthStatusModel, IndexResponseModel, IndexerResource } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -21,12 +25,12 @@ export class UmbDashboardExamineIndexElement extends UmbLitElement { @state() private _loading = true; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (_instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (_instance) => { this._modalContext = _instance; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts index 20c202422d..bc5fa79727 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts @@ -1,8 +1,8 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, nothing , customElement, state, query, property } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, nothing, customElement, state, query, property } from '@umbraco-cms/backoffice/external/lit'; import { - UmbModalContext, - UMB_MODAL_CONTEXT_TOKEN, + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_EXAMINE_FIELDS_SETTINGS_MODAL, } from '@umbraco-cms/backoffice/modal'; import { @@ -23,7 +23,7 @@ interface ExposedSearchResultField { @customElement('umb-dashboard-examine-searcher') export class UmbDashboardExamineSearcherElement extends UmbLitElement { - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; @property() searcherName!: string; @@ -42,7 +42,7 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/umb-search-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/umb-search-header-app.element.ts index 029422fc60..c0c567112f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/umb-search-header-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/umb-search-header-app.element.ts @@ -1,16 +1,16 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { css, CSSResultGroup, html , customElement } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { css, CSSResultGroup, html, customElement } from '@umbraco-cms/backoffice/external/lit'; +import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-search-header-app') export class UmbSearchHeaderAppElement extends UmbLitElement { - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (_instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (_instance) => { this._modalContext = _instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/published-status/dashboard-published-status.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/published-status/dashboard-published-status.element.ts index d059a34dad..ee106d02f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/published-status/dashboard-published-status.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/published-status/dashboard-published-status.element.ts @@ -1,6 +1,10 @@ import { UUIButtonState, UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { PublishedCacheResource } from '@umbraco-cms/backoffice/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -22,12 +26,12 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement { @state() private _buttonStateCollect: UUIButtonState = undefined; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/copy/copy.action.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/copy/copy.action.ts index 2c1caf46f3..0f675b4f14 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/copy/copy.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/copy/copy.action.ts @@ -1,26 +1,30 @@ import { UmbDataTypeRepository } from '../../repository/data-type.repository.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_DATA_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_DATA_TYPE_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; // TODO: investigate what we need to make a generic copy action export class UmbCopyDataTypeEntityAction extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalManagerContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { - this.#modalContext = instance; + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.#modalManagerContext = instance; }); } async execute() { - if (!this.#modalContext) throw new Error('Modal context is not available'); + if (!this.#modalManagerContext) throw new Error('Modal manager context is not available'); if (!this.repository) throw new Error('Repository is not available'); - const modalHandler = this.#modalContext?.open(UMB_DATA_TYPE_PICKER_MODAL); + const modalHandler = this.#modalManagerContext?.open(UMB_DATA_TYPE_PICKER_MODAL); const { selection } = await modalHandler.onSubmit(); await this.repository.copy(this.unique, selection[0]); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/create/create.action.ts index 64008eb5e7..730475c6b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/create/create.action.ts @@ -2,25 +2,25 @@ import { UmbDataTypeRepository } from '../../repository/data-type.repository.js' import { UMB_DATA_TYPE_CREATE_OPTIONS_MODAL } from './modal/index.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; export class UmbCreateDataTypeEntityAction extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalManagerContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { - this.#modalContext = instance; + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.#modalManagerContext = instance; }); } async execute() { - if (!this.#modalContext) throw new Error('Modal context is not available'); + if (!this.#modalManagerContext) throw new Error('Modal manager context is not available'); if (!this.repository) throw new Error('Repository is not available'); - this.#modalContext?.open(UMB_DATA_TYPE_CREATE_OPTIONS_MODAL, { + this.#modalManagerContext?.open(UMB_DATA_TYPE_CREATE_OPTIONS_MODAL, { parentKey: this.unique, }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/create/modal/data-type-create-options-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/create/modal/data-type-create-options-modal.element.ts index 857fd0fe49..3ad1e85bb9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/create/modal/data-type-create-options-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/create/modal/data-type-create-options-modal.element.ts @@ -1,12 +1,12 @@ import { DATA_TYPE_REPOSITORY_ALIAS } from '../../../repository/manifests.js'; import { UmbDataTypeCreateOptionsModalData } from './index.js'; -import { html , customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { - UmbModalContext, + UmbModalManagerContext, UmbModalHandler, UMB_FOLDER_MODAL, - UMB_MODAL_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -18,11 +18,11 @@ export class UmbDataTypeCreateOptionsModalElement extends UmbLitElement { @property({ type: Object }) data?: UmbDataTypeCreateOptionsModalData; - #modalContext?: UmbModalContext; + #modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/move/move.action.ts index 30f6f4a5c1..ae7c7e576e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/entity-actions/move/move.action.ts @@ -1,26 +1,30 @@ import { UmbDataTypeRepository } from '../../repository/data-type.repository.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_DATA_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_DATA_TYPE_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; // TODO: investigate what we need to make a generic move action export class UmbMoveDataTypeEntityAction extends UmbEntityActionBase { - #modalContext?: UmbModalContext; + #modalManagerContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { - this.#modalContext = instance; + new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.#modalManagerContext = instance; }); } async execute() { - if (!this.#modalContext) throw new Error('Modal context is not available'); + if (!this.#modalManagerContext) throw new Error('Modal manager context is not available'); if (!this.repository) throw new Error('Repository is not available'); - const modalHandler = this.#modalContext?.open(UMB_DATA_TYPE_PICKER_MODAL); + const modalHandler = this.#modalManagerContext?.open(UMB_DATA_TYPE_PICKER_MODAL); const { selection } = await modalHandler.onSubmit(); await this.repository.move(this.unique, selection[0]); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts index d6a697e45d..3365c01509 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts @@ -3,8 +3,8 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { - UmbModalContext, - UMB_MODAL_CONTEXT_TOKEN, + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_PROPERTY_EDITOR_UI_PICKER_MODAL, } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -38,12 +38,12 @@ export class UmbDataTypeDetailsWorkspaceViewEditElement private _data: Array = []; private _workspaceContext?: UmbDataTypeWorkspaceContext; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/extensions/workspace/extension-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/extensions/workspace/extension-root-workspace.element.ts index e82d909b07..246277ed52 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/extensions/workspace/extension-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/extensions/workspace/extension-root-workspace.element.ts @@ -1,22 +1,26 @@ -import { css, html , customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; import { isManifestElementNameType } from '@umbraco-cms/backoffice/extension-api'; import { ManifestTypes, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, +} from '@umbraco-cms/backoffice/modal'; @customElement('umb-extension-root-workspace') export class UmbExtensionRootWorkspaceElement extends UmbLitElement { @state() private _extensions?: Array = undefined; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; connectedCallback(): void { super.connectedCallback(); this._observeExtensions(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts index c445fc2c65..e018ccf0b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts @@ -1,13 +1,19 @@ import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context.js'; -import { UUIButtonElement, UUIInputElement, UUIPopoverElement, UUISymbolExpandElement , UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { css, html , customElement, query, state } from '@umbraco-cms/backoffice/external/lit'; +import { + UUIButtonElement, + UUIInputElement, + UUIPopoverElement, + UUISymbolExpandElement, + UUITextStyles, +} from '@umbraco-cms/backoffice/external/uui'; +import { css, html, customElement, query, state } from '@umbraco-cms/backoffice/external/lit'; import { Subject, debounceTime, tap } from '@umbraco-cms/backoffice/external/rxjs'; import { SavedLogSearchResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { query as getQuery, path, toQueryString } from '@umbraco-cms/backoffice/router'; import { - UMB_MODAL_CONTEXT_TOKEN, - UmbModalContext, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UmbModalManagerContext, UmbModalHandler, UmbModalToken, } from '@umbraco-cms/backoffice/modal'; @@ -49,7 +55,7 @@ export class UmbLogViewerSearchInputElement extends UmbLitElement { #logViewerContext?: UmbLogViewerWorkspaceContext; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; constructor() { super(); @@ -59,7 +65,7 @@ export class UmbLogViewerSearchInputElement extends UmbLitElement { this.#logViewerContext?.getSavedSearches(); }); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts index 87f5246c9b..c2e8c70cb6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts @@ -6,14 +6,14 @@ import { CodeSnippetType, UMB_MODAL_TEMPLATING_INSERT_FIELD_SIDEBAR_MODAL, } from '../../modals/insert-choose-type-sidebar.element.js'; -import { customElement, property , css, html } from '@umbraco-cms/backoffice/external/lit'; +import { customElement, property, css, html } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { UMB_DICTIONARY_ITEM_PICKER_MODAL, - UMB_MODAL_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_PARTIAL_VIEW_PICKER_MODAL, UmbDictionaryItemPickerModalResult, - UmbModalContext, + UmbModalManagerContext, UmbModalHandler, UmbModalToken, UmbPartialViewPickerModalResult, @@ -33,7 +33,7 @@ export class UmbTemplatingInsertMenuElement extends UmbLitElement { @property() value = ''; - private _modalContext?: UmbModalContext; + private _modalContext?: UmbModalManagerContext; #openModal?: UmbModalHandler; @@ -41,7 +41,7 @@ export class UmbTemplatingInsertMenuElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { this._modalContext = instance; }); } @@ -143,8 +143,8 @@ export class UmbTemplatingInsertMenuElement extends UmbLitElement { id="insert-button" label="open insert menu">
      -