From 435eeeb15bfcb508cd59043ab6791f1c9802db9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 21 Mar 2024 10:41:49 +0100 Subject: [PATCH 01/29] package base setup --- .../packages/core/validation/events/index.ts | 2 + .../events/validation-invalid.event.ts | 9 + .../events/validation-valid.event.ts | 9 + .../validation/events/validation.event.ts | 5 + .../src/packages/core/validation/index.ts | 2 + .../validation/mixins/form-control.mixin.ts | 389 ++++++++++++++++++ .../packages/core/validation/mixins/index.ts | 1 + 7 files changed, 417 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/events/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation-invalid.event.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation-valid.event.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation.event.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/index.ts new file mode 100644 index 0000000000..b3f00f0bd3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/index.ts @@ -0,0 +1,2 @@ +export * from './validation-valid.event.js'; +export * from './validation-invalid.event.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation-invalid.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation-invalid.event.ts new file mode 100644 index 0000000000..2fe6ad0c81 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation-invalid.event.ts @@ -0,0 +1,9 @@ +import { UmbValidationEvent } from './validation.event.js'; + +export class UmbValidationInvalidEvent extends UmbValidationEvent { + static readonly TYPE = 'invalid'; + + public constructor() { + super(UmbValidationInvalidEvent.TYPE); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation-valid.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation-valid.event.ts new file mode 100644 index 0000000000..5d4d29a031 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation-valid.event.ts @@ -0,0 +1,9 @@ +import { UmbValidationEvent } from './validation.event.js'; + +export class UmbValidationValidEvent extends UmbValidationEvent { + static readonly TYPE = 'valid'; + + constructor() { + super(UmbValidationValidEvent.TYPE); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation.event.ts new file mode 100644 index 0000000000..5b4948bf5f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation.event.ts @@ -0,0 +1,5 @@ +export class UmbValidationEvent extends Event { + public constructor(type: string) { + super(type, { bubbles: true, composed: false, cancelable: false }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts new file mode 100644 index 0000000000..c26329177e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts @@ -0,0 +1,2 @@ +export * from './events/index.js'; +export * from './mixins/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts new file mode 100644 index 0000000000..88fce999ac --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts @@ -0,0 +1,389 @@ +import { UmbValidationInvalidEvent } from '../events/validation-invalid.event.js'; +import { UmbValidationValidEvent } from '../events/validation-valid.event.js'; +import { property, type LitElement } from '@umbraco-cms/backoffice/external/lit'; +import type { HTMLElementConstructor } from '@umbraco-cms/backoffice/extension-api'; + +type NativeFormControlElement = HTMLInputElement | HTMLTextAreaElement | HTMLFormElement; // Eventually use a specific interface or list multiple options like appending these types: ... | HTMLTextAreaElement | HTMLSelectElement + +/* FlagTypes type options originate from: + * https://developer.mozilla.org/en-US/docs/Web/API/ValidityState + * */ +type FlagTypes = + | 'badInput' + | 'customError' + | 'patternMismatch' + | 'rangeOverflow' + | 'rangeUnderflow' + | 'stepMismatch' + | 'tooLong' + | 'tooShort' + | 'typeMismatch' + | 'valueMissing' + | 'badInput' + | 'valid'; + +// Acceptable as an internal interface/type, BUT if exposed externally this should be turned into a public class in a separate file. +interface Validator { + flagKey: FlagTypes; + getMessageMethod: () => string; + checkMethod: () => boolean; +} + +export interface UmbFormControlMixinInterface extends HTMLElement { + formAssociated: boolean; + get value(): ValueType | DefaultValueType; + set value(newValue: ValueType | DefaultValueType); + name: string; + formResetCallback(): void; + checkValidity(): boolean; + get validationMessage(): string; + get validity(): ValidityState; + setCustomValidity(error: string): void; + submit(): void; + pristine: boolean; + required: boolean; + requiredMessage: string; + error: boolean; + errorMessage: string; +} + +export declare abstract class UmbFormControlMixinElement + extends HTMLElement + implements UmbFormControlMixinInterface +{ + protected _internals: ElementInternals; + protected _runValidators(): void; + protected abstract getFormElement(): HTMLElement | undefined; + protected addValidator: (flagKey: FlagTypes, getMessageMethod: () => string, checkMethod: () => boolean) => void; + protected addFormControlElement(element: NativeFormControlElement): void; + + formAssociated: boolean; + get value(): ValueType | DefaultValueType; + set value(newValue: ValueType | DefaultValueType); + name: string; + formResetCallback(): void; + checkValidity(): boolean; + get validationMessage(): string; + get validity(): ValidityState; + setCustomValidity(error: string): void; + submit(): void; + pristine: boolean; + required: boolean; + requiredMessage: string; + error: boolean; + errorMessage: string; +} + +/** + * The mixin allows a custom element to participate in HTML forms. + * + * @param {Object} superClass - superclass to be extended. + * @mixin + */ +export const UUIFormControlMixin = < + ValueType = FormDataEntryValue | FormData, + T extends HTMLElementConstructor = HTMLElementConstructor, + DefaultValueType = unknown, +>( + superClass: T, + defaultValue: DefaultValueType, +) => { + abstract class UmbFormControlMixinClass extends superClass { + /** + * This is a static class field indicating that the element is can be used inside a native form and participate in its events. + * It may require a polyfill, check support here https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals. + * Read more about form controls here https://web.dev/more-capable-form-controls/ + * @type {boolean} + */ + static readonly formAssociated = true; + + /** + * This is a name property of the component. + * @type {string} + * @attr + * @default '' + */ + @property({ type: String }) + name = ''; + + /** + * Value of this form control. + * If you dont want the setFormValue to be called on the ElementInternals, then prevent calling this method, by not calling super.value = newValue in your implementation of the value setter method. + * @type {string} + * @attr value + * @default '' + */ + @property() // Do not 'reflect' as the attribute is used as fallback. + get value(): ValueType | DefaultValueType { + return this.#value; + } + set value(newValue: ValueType | DefaultValueType) { + const oldValue = this.#value; + this.#value = newValue; + if ('ElementInternals' in window && 'setFormValue' in window.ElementInternals.prototype) { + this._internals.setFormValue((this.#value as any) ?? null); + } + this.requestUpdate('value', oldValue); + } + + // Validation + private _validityState: any = {}; + + /** + * Determines wether the form control has been touched or interacted with, this determines wether the validation-status of this form control should be made visible. + * @type {boolean} + * @attr + * @default false + */ + @property({ type: Boolean, reflect: true }) + pristine: boolean = true; + + /** + * Apply validation rule for requiring a value of this form control. + * @attr + * @default false + */ + @property({ type: Boolean, reflect: true }) + required = false; + + /** + * Required validation message. + * @attr + */ + @property({ type: String, attribute: 'required-message' }) + requiredMessage = 'This field is required'; + + /** + * Apply custom error on this input. + * @attr + */ + @property({ type: Boolean, reflect: true }) + error = false; + + /** + * Custom error message. + * @attr + */ + @property({ type: String, attribute: 'error-message' }) + errorMessage = 'This field is invalid'; + + #value: ValueType | DefaultValueType = defaultValue; + _internals: ElementInternals; + #form: HTMLFormElement | null = null; + #validators: Validator[] = []; + #formCtrlElements: NativeFormControlElement[] = []; + + constructor(...args: any[]) { + super(...args); + this._internals = this.attachInternals(); + + this.addValidator( + 'valueMissing', + () => this.requiredMessage, + () => this.hasAttribute('required') && this.hasValue() === false, + ); + this.addValidator( + 'customError', + () => this.errorMessage, + () => this.error, + ); + + this.addEventListener('blur', () => { + this.pristine = false; + }); + } + + /** + * Determine wether this FormControl has a value. + * @method hasValue + * @returns {boolean} + */ + public hasValue(): boolean { + return this.value !== this.getDefaultValue(); + } + + /** + * Get internal form element. + * This has to be implemented to provide a FormControl Element of choice for the given context. The element is used as anchor for validation-messages. + * @abstract + * @method getFormElement + * @returns {HTMLElement | undefined} + */ + protected abstract getFormElement(): HTMLElement | undefined; + + disconnectedCallback(): void { + super.disconnectedCallback(); + this.#removeFormListeners(); + } + #removeFormListeners() { + if (this.#form) { + this.#form.removeEventListener('submit', this.#onFormSubmit); + } + } + + /** + * Add validator, to validate this Form Control. + * See https://developer.mozilla.org/en-US/docs/Web/API/ValidityState for available Validator FlagTypes. + * + * @example + * this.addValidator( + * 'tooLong', + * () => 'This input contains too many characters', + * () => this._value.length > 10 + * ); + * @method hasValue + * @param {FlagTypes} flagKey the type of validation. + * @param {method} getMessageMethod method to retrieve relevant message. Is executed every time the validator is re-executed. + * @param {method} checkMethod method to determine if this validator should invalidate this form control. Return true if this should prevent submission. + */ + protected addValidator(flagKey: FlagTypes, getMessageMethod: () => string, checkMethod: () => boolean): Validator { + const obj = { + flagKey: flagKey, + getMessageMethod: getMessageMethod, + checkMethod: checkMethod, + }; + this.#validators.push(obj); + return obj; + } + + protected removeValidator(validator: Validator) { + const index = this.#validators.indexOf(validator); + if (index !== -1) { + this.#validators.splice(index, 1); + } + } + + /** + * @method addFormControlElement + * @description Important notice if adding a native form control then ensure that its value and thereby validity is updated when value is changed from the outside. + * @param element {NativeFormControlElement} - element to validate and include as part of this form association. + */ + protected addFormControlElement(element: NativeFormControlElement) { + this.#formCtrlElements.push(element); + } + + private _customValidityObject?: Validator; + + /** + * @method setCustomValidity + * @description Set custom validity state, set to empty string to remove the custom message. + * @param message {string} - The message to be shown + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLObjectElement/setCustomValidity|HTMLObjectElement:setCustomValidity} + */ + protected setCustomValidity(message: string | null) { + if (this._customValidityObject) { + this.removeValidator(this._customValidityObject); + } + + if (message != null && message !== '') { + this._customValidityObject = this.addValidator( + 'customError', + (): string => message, + () => true, + ); + } + + this._runValidators(); + } + + /** + * @method _runValidators + * @description Run all validators and set the validityState of this form control. + * Run this method when you want to re-run all validators. + * This can be relevant if you have a validators that is using values that is not triggering the Lit Updated Callback. + * Such are mainly properties that are not declared as a Lit state and or Lit property. + */ + protected _runValidators() { + this._validityState = {}; + + // Loop through inner native form controls to adapt their validityState. + this.#formCtrlElements.forEach((formCtrlEl) => { + for (const key in formCtrlEl.validity) { + if (key !== 'valid' && (formCtrlEl.validity as any)[key]) { + (this as any)._validityState[key] = true; + this._internals.setValidity((this as any)._validityState, formCtrlEl.validationMessage, formCtrlEl); + } + } + }); + + // Loop through custom validators, currently its intentional to have them overwritten native validity. but might need to be reconsidered (This current way enables to overwrite with custom messages) [NL] + this.#validators.forEach((validator) => { + if (validator.checkMethod()) { + this._validityState[validator.flagKey] = true; + this._internals.setValidity(this._validityState, validator.getMessageMethod(), this.getFormElement()); + } + }); + + const hasError = Object.values(this._validityState).includes(true); + + // https://developer.mozilla.org/en-US/docs/Web/API/ValidityState#valid + this._validityState.valid = !hasError; + + if (hasError) { + this.dispatchEvent(new UmbValidationInvalidEvent()); + } else { + this._internals.setValidity({}); + this.dispatchEvent(new UmbValidationValidEvent()); + } + } + + updated(changedProperties: Map) { + super.updated(changedProperties); + this._runValidators(); + } + + #onFormSubmit = () => { + this.pristine = false; + }; + + public submit() { + this.#form?.requestSubmit(); + } + + public formAssociatedCallback() { + this.#removeFormListeners(); + this.#form = this._internals.form; + if (this.#form) { + // This relies on the form begin a 'uui-form': [NL] + if (this.#form.hasAttribute('submit-invalid')) { + this.pristine = false; + } + this.#form.addEventListener('submit', this.#onFormSubmit); + } + } + public formResetCallback() { + this.pristine = true; + this.value = this.getInitialValue() ?? this.getDefaultValue(); + } + + protected getDefaultValue(): DefaultValueType { + return defaultValue; + } + protected getInitialValue(): ValueType | DefaultValueType { + return this.getAttribute('value') as ValueType | DefaultValueType; + } + + public checkValidity() { + for (const key in this.#formCtrlElements) { + if (this.#formCtrlElements[key].checkValidity() === false) { + return false; + } + } + + return this._internals?.checkValidity(); + } + + // https://developer.mozilla.org/en-US/docs/Web/API/HTMLObjectElement/validity + public get validity(): ValidityState { + return this._validityState; + } + + get validationMessage() { + return this._internals?.validationMessage; + } + } + return UmbFormControlMixinClass as unknown as HTMLElementConstructor< + UmbFormControlMixinElement + > & + T; +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/index.ts new file mode 100644 index 0000000000..0635d528ca --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/index.ts @@ -0,0 +1 @@ +export * from './form-control.mixin.js'; From 9936e5754cf2658b6d26d8f022a49ff5fbe8274c Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 12:00:00 +0100 Subject: [PATCH 02/29] Feature: Datatypepickerflow - Property Icons --- ...-picker-flow-data-type-picker-modal.element.ts | 15 ++++++++++++++- .../data-type-picker-flow-modal.element.ts | 5 ++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index 9df268dfcf..37af6d4eaa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -7,6 +7,7 @@ import { css, html, customElement, state, repeat, when } from '@umbraco-cms/back import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { UmbDataTypeItemModel } from '@umbraco-cms/backoffice/data-type'; +import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-data-type-picker-flow-data-type-picker-modal') export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBaseElement< @@ -18,6 +19,8 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas private _propertyEditorUiAlias!: string; + #propertyEditorUIs: Array = []; + connectedCallback(): void { super.connectedCallback(); @@ -26,6 +29,13 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas this._propertyEditorUiAlias = this.data.propertyEditorUiAlias; this._observeDataTypesOf(this._propertyEditorUiAlias); + + this.observe(umbExtensionsRegistry.byType('propertyEditorUi'), (propertyEditorUIs) => { + // Only include Property Editor UIs which has Property Editor Schema Alias + this.#propertyEditorUIs = propertyEditorUIs.filter( + (propertyEditorUi) => !!propertyEditorUi.meta.propertyEditorSchemaAlias, + ); + }); } private async _observeDataTypesOf(propertyEditorUiAlias: string) { @@ -86,7 +96,10 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas ? html`
  • - + ui.alias === dataType.propertyEditorUiAlias)?.meta + .icon ?? 'icon-bug'} + class="icon"> ${dataType.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index af03a97473..f1eaf70ce1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -278,7 +278,10 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< html`
  • - + ${dataType.name}
    From 9e4fb4c4ecdf007b1305fa016209c46693a869dd Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:02:07 +0100 Subject: [PATCH 03/29] set icons --- ...data-type-collection.server.data-source.ts | 9 +++++++ .../data-type-flow-input.element.ts | 2 -- .../ref-data-type/ref-data-type.element.ts | 26 +++++++++++++++++-- ...ker-flow-data-type-picker-modal.element.ts | 15 +---------- .../data-type-picker-flow-modal.element.ts | 8 ++---- .../item/data-type-item.server.data-source.ts | 12 +++++++++ .../data-type/repository/item/types.ts | 1 + 7 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts index c6dd9ce6f5..558131b3e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts @@ -5,6 +5,7 @@ import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; import type { DataTypeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; /** * A data source that fetches the data-type collection data from the server. @@ -14,6 +15,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; */ export class UmbDataTypeCollectionServerDataSource implements UmbCollectionDataSource { #host: UmbControllerHost; + #manifestPropertyEditorUis: Array = []; /** * Creates an instance of UmbDataTypeCollectionServerDataSource. @@ -22,6 +24,12 @@ export class UmbDataTypeCollectionServerDataSource implements UmbCollectionDataS */ constructor(host: UmbControllerHost) { this.#host = host; + umbExtensionsRegistry + .byType('propertyEditorUi') + .subscribe((manifestPropertyEditorUIs) => { + this.#manifestPropertyEditorUis = manifestPropertyEditorUIs; + }) + .unsubscribe(); } /** @@ -48,6 +56,7 @@ export class UmbDataTypeCollectionServerDataSource implements UmbCollectionDataS unique: item.id, name: item.name, propertyEditorUiAlias: item.editorUiAlias!, + icon: this.#manifestPropertyEditorUis.find((ui) => ui.alias === item.editorUiAlias!)?.meta.icon, }; return dataTypeDetail; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts index 2f888c4a5b..d89712a6da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts @@ -78,8 +78,6 @@ export class UmbInputDataTypeElement extends FormControlMixin(UmbLitElement) { this.#editDataTypeModal?.open({}, 'edit/' + this._ids![0]); }} standalone> - - diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 4af4380ec5..fa6f3d3fe1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -2,6 +2,8 @@ import { UmbDataTypeDetailRepository } from '../../repository/detail/data-type-d import { UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; +import { UmbIconRegistry } from '@umbraco-cms/backoffice/icon'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; /** * @element umb-ref-data-type @@ -10,8 +12,27 @@ import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; */ @customElement('umb-ref-data-type') export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { - protected fallbackIcon = - ''; + #iconRegistry = new UmbIconRegistry(); // TODO Can we access the icon registry from UmbAppElement? + //icon-circle-dotted.svg + #svg = ``; + + @state() + protected fallbackIcon = this.#svg; + + async #getIconFromRegistry() { + this.observe( + umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), + async (manifestPropertyEditorUi) => { + const icon = await this.#iconRegistry.getIcon(manifestPropertyEditorUi?.meta.icon ?? ''); + if (icon) { + this.fallbackIcon = icon; + } else { + this.fallbackIcon = this.#svg; + } + }, + ), + '_observeIcon'; + } @property({ type: String, attribute: 'data-type-id' }) public get dataTypeId(): string | undefined { @@ -30,6 +51,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { this.name = dataType.name ?? ''; this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.propertyEditorSchemaAlias = dataType.editorAlias ?? ''; + this.#getIconFromRegistry(); } }, 'dataType', diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index 37af6d4eaa..ae5a854a02 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -7,7 +7,6 @@ import { css, html, customElement, state, repeat, when } from '@umbraco-cms/back import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { UmbDataTypeItemModel } from '@umbraco-cms/backoffice/data-type'; -import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-data-type-picker-flow-data-type-picker-modal') export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBaseElement< @@ -19,8 +18,6 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas private _propertyEditorUiAlias!: string; - #propertyEditorUIs: Array = []; - connectedCallback(): void { super.connectedCallback(); @@ -29,13 +26,6 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas this._propertyEditorUiAlias = this.data.propertyEditorUiAlias; this._observeDataTypesOf(this._propertyEditorUiAlias); - - this.observe(umbExtensionsRegistry.byType('propertyEditorUi'), (propertyEditorUIs) => { - // Only include Property Editor UIs which has Property Editor Schema Alias - this.#propertyEditorUIs = propertyEditorUIs.filter( - (propertyEditorUi) => !!propertyEditorUi.meta.propertyEditorSchemaAlias, - ); - }); } private async _observeDataTypesOf(propertyEditorUiAlias: string) { @@ -96,10 +86,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas ? html`
  • - ui.alias === dataType.propertyEditorUiAlias)?.meta - .icon ?? 'icon-bug'} - class="icon"> + ${dataType.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index f1eaf70ce1..220f8a3971 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -1,4 +1,3 @@ -import { UmbDataTypeTreeRepository } from '../../tree/data-type-tree.repository.js'; import { UMB_DATATYPE_WORKSPACE_MODAL } from '../../workspace/data-type-workspace.modal-token.js'; import { UMB_DATA_TYPE_ENTITY_TYPE } from '../../entity.js'; import { UmbDataTypeCollectionRepository } from '../../collection/index.js'; @@ -275,13 +274,10 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< dataTypes, (dataType) => dataType.unique, (dataType) => - html`
  • + html`
  • - + ${dataType.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/data-type-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/data-type-item.server.data-source.ts index d2963a59c1..6e5faabc94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/data-type-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/data-type-item.server.data-source.ts @@ -3,6 +3,9 @@ import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository' import type { DataTypeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; + +let manifestPropertyEditorUis: Array = []; /** * A server data source for Data Type items @@ -19,11 +22,19 @@ export class UmbDataTypeItemServerDataSource extends UmbItemServerDataSourceBase * @param {UmbControllerHost} host * @memberof UmbDataTypeItemServerDataSource */ + constructor(host: UmbControllerHost) { super(host, { getItems, mapper, }); + + umbExtensionsRegistry + .byType('propertyEditorUi') + .subscribe((manifestPropertyEditorUIs) => { + manifestPropertyEditorUis = manifestPropertyEditorUIs; + }) + .unsubscribe(); } } @@ -35,5 +46,6 @@ const mapper = (item: DataTypeItemResponseModel): UmbDataTypeItemModel => { unique: item.id, name: item.name, propertyEditorUiAlias: item.editorUiAlias || '', // TODO: why can this be undefined or null on the server? + icon: manifestPropertyEditorUis.find((ui) => ui.alias === item.editorUiAlias)?.meta.icon, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/types.ts index d798ac80cc..185aa5cba4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/item/types.ts @@ -2,4 +2,5 @@ export interface UmbDataTypeItemModel { unique: string; name: string; propertyEditorUiAlias: string; + icon?: string; } From 717e9c9e8f535ca981c6f71cbc6a66e7c69cb6ad Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:09:07 +0100 Subject: [PATCH 04/29] use umb-icon --- .../data-type-picker-flow-data-type-picker-modal.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index ae5a854a02..a780536777 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -86,7 +86,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas ? html`
  • - + ${dataType.name}
    From 64ab772fb46908392b05c11a2477571f67865418 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:29:45 +0100 Subject: [PATCH 05/29] datatype tree icons --- .../tree/data-type-tree.server.data-source.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts index d4fda7664a..7f0af01905 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts @@ -4,6 +4,9 @@ import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DataTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; + +let manifestPropertyEditorUis: Array = []; /** * A data source for a data type tree that fetches data from the server @@ -26,12 +29,19 @@ export class UmbDataTypeTreeServerDataSource extends UmbTreeServerDataSourceBase getChildrenOf, mapper, }); + umbExtensionsRegistry + .byType('propertyEditorUi') + .subscribe((manifestPropertyEditorUIs) => { + manifestPropertyEditorUis = manifestPropertyEditorUIs; + }) + .unsubscribe(); } } -const getRootItems = (args: UmbTreeRootItemsRequestArgs) => +const getRootItems = async (args: UmbTreeRootItemsRequestArgs) => { // eslint-disable-next-line local-rules/no-direct-api-import - DataTypeResource.getTreeDataTypeRoot({ skip: args.skip, take: args.take }); + return DataTypeResource.getTreeDataTypeRoot({ skip: args.skip, take: args.take }); +}; const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { @@ -48,6 +58,7 @@ const mapper = (item: DataTypeTreeItemResponseModel): UmbDataTypeTreeItemModel = return { unique: item.id, parentUnique: item.parent?.id || null, + icon: manifestPropertyEditorUis.find((ui) => ui.alias === item.editorUiAlias)?.meta.icon, name: item.name, entityType: item.isFolder ? 'data-type-folder' : 'data-type', isFolder: item.isFolder, From 3d07569de8d0402d6f4e53af8ea026b1f42a575c Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:31:16 +0100 Subject: [PATCH 06/29] show icon-circle-dotted when no icon --- .../data-type-picker-flow-data-type-picker-modal.element.ts | 2 +- .../data-type-picker-flow-modal.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index a780536777..23d0012b14 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -86,7 +86,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas ? html`
  • - + ${dataType.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index 220f8a3971..d0d634e4e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -277,7 +277,7 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< html`
  • - + ${dataType.name}
    From 6c352947e2104102e80f972b482365422611aa03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 21 Mar 2024 20:30:02 +0100 Subject: [PATCH 07/29] initial restructure --- src/Umbraco.Web.UI.Client/package.json | 1 + .../block-grid-area-type-workspace.context.ts | 8 +- .../workspace/block-type-workspace.context.ts | 8 +- .../workspace/block-workspace.context.ts | 6 +- .../input-number-range.element.ts | 20 ++- .../models/workspace.model.ts | 4 +- .../validation/events/validation.event.ts | 2 +- .../validation/mixins/form-control.mixin.ts | 131 ++++-------------- .../validation/mixins/validity-state.class.ts | 15 ++ .../variant-selector.element.ts | 10 +- .../common/save/save.action.ts | 2 +- .../workspace-footer.element.ts | 2 +- .../workspace-has-collection.condition.ts | 2 +- .../contexts/default-workspace.context.ts | 4 +- .../packages/core/workspace/contexts/index.ts | 16 +-- ....ts => saveable-workspace-context-base.ts} | 22 ++- .../saveable-workspace-context.interface.ts | 10 -- .../entity-workspace-context.interface.ts | 8 ++ .../core/workspace/contexts/tokens/index.ts | 13 ++ ...nt-dataset-workspace-context.interface.ts} | 12 +- ...y-structure-workspace-context.interface.ts | 4 +- ...publishable-workspace-context.interface.ts | 0 .../publishable-workspace.context-token.ts | 0 .../routable-workspace-context.interface.ts | 2 +- .../saveable-workspace-context.interface.ts | 12 ++ .../saveable-workspace.context-token.ts | 0 ...nt-dataset-workspace-context.interface.ts} | 15 +- .../variant-workspace-context.token.ts | 6 +- .../workspace-collection-context.interface.ts | 0 .../workspace-collection-context.token.ts | 0 .../workspace-context.interface.ts | 0 .../{ => tokens}/workspace-context.token.ts | 0 .../workspace-is-new-redirect.controller.ts | 4 +- .../editable/editable-workspace.element.ts | 35 +++++ .../kinds/editable/editable-workspace.kind.ts | 13 ++ .../kinds/editable/editable-workspace.test.ts | 22 +++ .../core/workspace/kinds/manifests.ts | 2 +- .../routable-workspace.element.ts | 2 +- .../{ => routable}/routable-workspace.kind.ts | 0 .../{ => routable}/routable-workspace.test.ts | 0 ...iant-workspace-property-dataset-context.ts | 4 +- .../data-type-workspace-editor.element.ts | 2 +- .../workspace/data-type-workspace.context.ts | 13 +- .../workspace/dictionary-workspace.context.ts | 5 +- .../document-type-workspace.context.ts | 6 +- .../workspace/document-workspace.context.ts | 8 +- .../language/language-workspace.context.ts | 29 ++-- ...language-details-workspace-view.element.ts | 11 -- .../workspace/media-type-workspace.context.ts | 6 +- .../workspace/media-workspace.context.ts | 10 +- .../member-group-workspace.context.ts | 4 +- .../member-type-workspace.context.ts | 6 +- .../workspace/member-workspace.context.ts | 11 +- .../relation-type-workspace.context.ts | 5 +- .../partial-view-workspace.context.ts | 5 +- .../workspace/script-workspace.context.ts | 5 +- .../workspace/stylesheet-workspace.context.ts | 5 +- .../workspace/template-workspace.context.ts | 6 +- .../workspace/user-group-workspace.context.ts | 5 +- .../user/workspace/user-workspace.context.ts | 4 +- src/Umbraco.Web.UI.Client/tsconfig.json | 1 + 61 files changed, 305 insertions(+), 259 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/validity-state.class.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{editable-workspace-context-base.ts => saveable-workspace-context-base.ts} (70%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/index.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{workspace-invariantable-context.interface.ts => tokens/invariant-dataset-workspace-context.interface.ts} (62%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/property-structure-workspace-context.interface.ts (69%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/publishable-workspace-context.interface.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/publishable-workspace.context-token.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/routable-workspace-context.interface.ts (77%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace-context.interface.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/saveable-workspace.context-token.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{workspace-variantable-context.interface.ts => tokens/variant-dataset-workspace-context.interface.ts} (68%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/variant-workspace-context.token.ts (54%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/workspace-collection-context.interface.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/workspace-collection-context.token.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/workspace-context.interface.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/{ => tokens}/workspace-context.token.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.kind.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/{ => routable}/routable-workspace.element.ts (89%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/{ => routable}/routable-workspace.kind.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/{ => routable}/routable-workspace.test.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 9018243daf..ae7b79bda4 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -83,6 +83,7 @@ "./user-permission": "./dist-cms/packages/user/user-permission/index.js", "./user": "./dist-cms/packages/user/user/index.js", "./utils": "./dist-cms/packages/core/utils/index.js", + "./validation": "./dist-cms/packages/core/validation/index.js", "./variant": "./dist-cms/packages/core/variant/index.js", "./webhook": "./dist-cms/packages/webhook/index.js", "./workspace": "./dist-cms/packages/core/workspace/index.js", diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts index 3dfbff5f95..4a2a9e03d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts @@ -2,11 +2,11 @@ import type { UmbBlockGridTypeAreaType } from '../../../types.js'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { - UmbInvariantableWorkspaceContextInterface, + UmbInvariantDatasetWorkspaceContextInterface, UmbWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbInvariantWorkspacePropertyDatasetContext, } from '@umbraco-cms/backoffice/workspace'; import { UmbArrayState, UmbObjectState, appendToFrozenArray } from '@umbraco-cms/backoffice/observable-api'; @@ -15,8 +15,8 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { ManifestWorkspace, PropertyEditorSettingsProperty } from '@umbraco-cms/backoffice/extension-registry'; export class UmbBlockGridAreaTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase - implements UmbInvariantableWorkspaceContextInterface + extends UmbSaveableWorkspaceContextBase + implements UmbInvariantDatasetWorkspaceContextInterface { // Just for context token safety: public readonly IS_BLOCK_GRID_AREA_TYPE_WORKSPACE_CONTEXT = true; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts index 74b691f62e..bebf574d53 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts @@ -3,11 +3,11 @@ import { UmbBlockTypeWorkspaceEditorElement } from './block-type-workspace-edito import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { - UmbInvariantableWorkspaceContextInterface, + UmbInvariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbInvariantWorkspacePropertyDatasetContext, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, @@ -17,8 +17,8 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { ManifestWorkspace, PropertyEditorSettingsProperty } from '@umbraco-cms/backoffice/extension-registry'; export class UmbBlockTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase - implements UmbInvariantableWorkspaceContextInterface, UmbRoutableWorkspaceContext + extends UmbSaveableWorkspaceContextBase + implements UmbInvariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext { // Just for context token safety: public readonly IS_BLOCK_TYPE_WORKSPACE_CONTEXT = true; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts index b9ebead2b4..c379a4ce51 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts @@ -2,7 +2,7 @@ import type { UmbBlockDataType, UmbBlockLayoutBaseModel } from '../types.js'; import { UmbBlockElementManager } from './block-element-manager.js'; import { UmbBlockWorkspaceEditorElement } from './block-workspace-editor.element.js'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, type UmbRoutableWorkspaceContext, UmbWorkspaceIsNewRedirectController, @@ -20,7 +20,7 @@ import { decodeFilePath } from '@umbraco-cms/backoffice/utils'; export type UmbBlockWorkspaceElementManagerNames = 'content' | 'settings'; export class UmbBlockWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbRoutableWorkspaceContext { // Just for context token safety: @@ -48,7 +48,7 @@ export class UmbBlockWorkspaceContext(undefined); readonly layout = this.#layout.asObservable(); - //readonly unique = this.#layout.asObservablePart((x) => x?.contentUdi); + readonly unique = this.#layout.asObservablePart((x) => x?.contentUdi); readonly contentUdi = this.#layout.asObservablePart((x) => x?.contentUdi); readonly content = new UmbBlockElementManager(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts index ca4f086e89..7a1dc8c7fa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts @@ -1,5 +1,5 @@ -import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UmbFormControlMixin } from '@umbraco-cms/backoffice/validation'; +import { html, customElement, property, state, PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; function getNumberOrUndefined(value: string) { @@ -8,7 +8,7 @@ function getNumberOrUndefined(value: string) { } @customElement('umb-input-number-range') -export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) { +export class UmbInputNumberRangeElement extends UmbFormControlMixin(UmbLitElement, undefined) { @property({ type: String, attribute: 'min-label' }) minLabel = 'Low value'; @@ -40,7 +40,8 @@ export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) } private updateValue() { - const newValue = this._minValue || this._maxValue ? (this._minValue || '') + ',' + (this._maxValue || '') : ''; + const newValue = + this._minValue || this._maxValue ? (this._minValue ?? '') + ',' + (this._maxValue ?? '') : undefined; if (super.value !== newValue) { super.value = newValue; } @@ -48,7 +49,7 @@ export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) @property() public set value(valueString: string) { - if (valueString !== this._value) { + if (valueString !== this.value) { const splittedValue = valueString.split(/[ ,]+/); this.minValue = getNumberOrUndefined(splittedValue[0]); this.maxValue = getNumberOrUndefined(splittedValue[1]); @@ -62,6 +63,13 @@ export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) return this; } + protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { + super.firstUpdated(_changedProperties); + this.shadowRoot + ?.querySelectorAll('uui-input') + .forEach((x) => this.addFormControlElement(x as unknown as HTMLInputElement)); + } + private _onMinInput(e: InputEvent) { this.minValue = Number((e.target as HTMLInputElement).value); this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); @@ -70,11 +78,13 @@ export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) private _onMaxInput(e: InputEvent) { this.maxValue = Number((e.target as HTMLInputElement).value); this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); + this._runValidators(); } render() { return html` diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/workspace.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/workspace.model.ts index e4d674f53f..7be5f5b1be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/workspace.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/workspace.model.ts @@ -1,5 +1,5 @@ -import type { UmbRoutableWorkspaceContext } from '../../workspace/contexts/routable-workspace-context.interface.js'; -import type { UmbWorkspaceContextInterface } from '../../workspace/contexts/workspace-context.interface.js'; +import type { UmbRoutableWorkspaceContext } from '../../workspace/contexts/tokens/routable-workspace-context.interface.js'; +import type { UmbWorkspaceContextInterface } from '../../workspace/contexts/tokens/workspace-context.interface.js'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import type { ManifestElementAndApi } from '@umbraco-cms/backoffice/extension-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation.event.ts index 5b4948bf5f..62d03f34da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation.event.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/events/validation.event.ts @@ -1,5 +1,5 @@ export class UmbValidationEvent extends Event { public constructor(type: string) { - super(type, { bubbles: true, composed: false, cancelable: false }); + super(type, { bubbles: true, composed: true, cancelable: false }); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts index 88fce999ac..3009882074 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts @@ -1,9 +1,10 @@ import { UmbValidationInvalidEvent } from '../events/validation-invalid.event.js'; import { UmbValidationValidEvent } from '../events/validation-valid.event.js'; +import { UmbValidityState } from './validity-state.class.js'; import { property, type LitElement } from '@umbraco-cms/backoffice/external/lit'; import type { HTMLElementConstructor } from '@umbraco-cms/backoffice/extension-api'; -type NativeFormControlElement = HTMLInputElement | HTMLTextAreaElement | HTMLFormElement; // Eventually use a specific interface or list multiple options like appending these types: ... | HTMLTextAreaElement | HTMLSelectElement +type NativeFormControlElement = HTMLInputElement | HTMLTextAreaElement; // Eventually use a specific interface or list multiple options like appending these types: ... | HTMLTextAreaElement | HTMLSelectElement /* FlagTypes type options originate from: * https://developer.mozilla.org/en-US/docs/Web/API/ValidityState @@ -33,7 +34,6 @@ export interface UmbFormControlMixinInterface exten formAssociated: boolean; get value(): ValueType | DefaultValueType; set value(newValue: ValueType | DefaultValueType); - name: string; formResetCallback(): void; checkValidity(): boolean; get validationMessage(): string; @@ -48,7 +48,7 @@ export interface UmbFormControlMixinInterface exten } export declare abstract class UmbFormControlMixinElement - extends HTMLElement + extends LitElement implements UmbFormControlMixinInterface { protected _internals: ElementInternals; @@ -60,7 +60,6 @@ export declare abstract class UmbFormControlMixinElement = HTMLElementConstructor, DefaultValueType = unknown, @@ -97,15 +96,6 @@ export const UUIFormControlMixin = < */ static readonly formAssociated = true; - /** - * This is a name property of the component. - * @type {string} - * @attr - * @default '' - */ - @property({ type: String }) - name = ''; - /** * Value of this form control. * If you dont want the setFormValue to be called on the ElementInternals, then prevent calling this method, by not calling super.value = newValue in your implementation of the value setter method. @@ -113,21 +103,17 @@ export const UUIFormControlMixin = < * @attr value * @default '' */ - @property() // Do not 'reflect' as the attribute is used as fallback. + @property({ reflect: false }) // Do not 'reflect' as the attribute is used as fallback. get value(): ValueType | DefaultValueType { return this.#value; } set value(newValue: ValueType | DefaultValueType) { - const oldValue = this.#value; this.#value = newValue; - if ('ElementInternals' in window && 'setFormValue' in window.ElementInternals.prototype) { - this._internals.setFormValue((this.#value as any) ?? null); - } - this.requestUpdate('value', oldValue); + this._runValidators(); } // Validation - private _validityState: any = {}; + private _validityState = new UmbValidityState(); /** * Determines wether the form control has been touched or interacted with, this determines wether the validation-status of this form control should be made visible. @@ -138,37 +124,8 @@ export const UUIFormControlMixin = < @property({ type: Boolean, reflect: true }) pristine: boolean = true; - /** - * Apply validation rule for requiring a value of this form control. - * @attr - * @default false - */ - @property({ type: Boolean, reflect: true }) - required = false; - - /** - * Required validation message. - * @attr - */ - @property({ type: String, attribute: 'required-message' }) - requiredMessage = 'This field is required'; - - /** - * Apply custom error on this input. - * @attr - */ - @property({ type: Boolean, reflect: true }) - error = false; - - /** - * Custom error message. - * @attr - */ - @property({ type: String, attribute: 'error-message' }) - errorMessage = 'This field is invalid'; - #value: ValueType | DefaultValueType = defaultValue; - _internals: ElementInternals; + protected _internals: ElementInternals; #form: HTMLFormElement | null = null; #validators: Validator[] = []; #formCtrlElements: NativeFormControlElement[] = []; @@ -177,31 +134,12 @@ export const UUIFormControlMixin = < super(...args); this._internals = this.attachInternals(); - this.addValidator( - 'valueMissing', - () => this.requiredMessage, - () => this.hasAttribute('required') && this.hasValue() === false, - ); - this.addValidator( - 'customError', - () => this.errorMessage, - () => this.error, - ); - - this.addEventListener('blur', () => { + this.addEventListener('focusout', () => { this.pristine = false; + this.checkValidity(); }); } - /** - * Determine wether this FormControl has a value. - * @method hasValue - * @returns {boolean} - */ - public hasValue(): boolean { - return this.value !== this.getDefaultValue(); - } - /** * Get internal form element. * This has to be implemented to provide a FormControl Element of choice for the given context. The element is used as anchor for validation-messages. @@ -231,7 +169,7 @@ export const UUIFormControlMixin = < * () => 'This input contains too many characters', * () => this._value.length > 10 * ); - * @method hasValue + * @method addValidator * @param {FlagTypes} flagKey the type of validation. * @param {method} getMessageMethod method to retrieve relevant message. Is executed every time the validator is re-executed. * @param {method} checkMethod method to determine if this validator should invalidate this form control. Return true if this should prevent submission. @@ -260,30 +198,12 @@ export const UUIFormControlMixin = < */ protected addFormControlElement(element: NativeFormControlElement) { this.#formCtrlElements.push(element); - } - - private _customValidityObject?: Validator; - - /** - * @method setCustomValidity - * @description Set custom validity state, set to empty string to remove the custom message. - * @param message {string} - The message to be shown - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLObjectElement/setCustomValidity|HTMLObjectElement:setCustomValidity} - */ - protected setCustomValidity(message: string | null) { - if (this._customValidityObject) { - this.removeValidator(this._customValidityObject); - } - - if (message != null && message !== '') { - this._customValidityObject = this.addValidator( - 'customError', - (): string => message, - () => true, - ); - } - - this._runValidators(); + /*element.addEventListener(UmbValidationInvalidEvent.TYPE, () => { + this._runValidators(); + }); + element.addEventListener(UmbValidationValidEvent.TYPE, () => { + this._runValidators(); + });*/ } /** @@ -294,14 +214,15 @@ export const UUIFormControlMixin = < * Such are mainly properties that are not declared as a Lit state and or Lit property. */ protected _runValidators() { - this._validityState = {}; + this._validityState = new UmbValidityState(); // Loop through inner native form controls to adapt their validityState. this.#formCtrlElements.forEach((formCtrlEl) => { - for (const key in formCtrlEl.validity) { - if (key !== 'valid' && (formCtrlEl.validity as any)[key]) { - (this as any)._validityState[key] = true; - this._internals.setValidity((this as any)._validityState, formCtrlEl.validationMessage, formCtrlEl); + let key: keyof ValidityState; + for (key in formCtrlEl.validity) { + if (key !== 'valid' && formCtrlEl.validity[key]) { + this._validityState[key] = true; + this._internals.setValidity(this._validityState, formCtrlEl.validationMessage, formCtrlEl); } } }); @@ -320,8 +241,10 @@ export const UUIFormControlMixin = < this._validityState.valid = !hasError; if (hasError) { + console.log('HAS ERROR', this.validationMessage, this.pristine); this.dispatchEvent(new UmbValidationInvalidEvent()); } else { + console.log('IS VALID', this.validationMessage, this.pristine); this._internals.setValidity({}); this.dispatchEvent(new UmbValidationValidEvent()); } @@ -336,10 +259,6 @@ export const UUIFormControlMixin = < this.pristine = false; }; - public submit() { - this.#form?.requestSubmit(); - } - public formAssociatedCallback() { this.#removeFormListeners(); this.#form = this._internals.form; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/validity-state.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/validity-state.class.ts new file mode 100644 index 0000000000..d62b087a0a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/validity-state.class.ts @@ -0,0 +1,15 @@ +type Writeable = { -readonly [P in keyof T]: T[P] }; + +export class UmbValidityState implements Writeable { + badInput: boolean = false; + customError: boolean = false; + patternMismatch: boolean = false; + rangeOverflow: boolean = false; + rangeUnderflow: boolean = false; + stepMismatch: boolean = false; + tooLong: boolean = false; + tooShort: boolean = false; + typeMismatch: boolean = false; + valid: boolean = false; + valueMissing: boolean = false; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/variant-selector/variant-selector.element.ts index ce0148af9d..fe361e65e3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/variant-selector/variant-selector.element.ts @@ -99,7 +99,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { async #observeActiveVariants() { if (!this.#splitViewContext) return; - const workspaceContext = this.#splitViewContext.getWorkspaceContext(); + const workspaceContext = this.#splitViewContext.getWorkspaceContext() as UmbDocumentWorkspaceContext; if (workspaceContext) { this.observe( workspaceContext.splitView.activeVariantsInfo, @@ -223,9 +223,9 @@ export class UmbVariantSelectorElement extends UmbLitElement { - ` + ` : ''} - ` + ` : nothing } @@ -264,7 +264,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { @click=${() => this.#openSplitView(variant)}> Split view - `} + `}
  • `, )} @@ -272,7 +272,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { - ` + ` : nothing } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/save/save.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/save/save.action.ts index d106cae3e5..2bd18c3909 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/save/save.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/save/save.action.ts @@ -1,4 +1,4 @@ -import type { UmbSaveableWorkspaceContextInterface } from '../../../../contexts/saveable-workspace-context.interface.js'; +import type { UmbSaveableWorkspaceContextInterface } from '../../../../contexts/tokens/saveable-workspace-context.interface.js'; import { UmbWorkspaceActionBase } from '../../workspace-action-base.controller.js'; import { UMB_SAVEABLE_WORKSPACE_CONTEXT, type UmbWorkspaceActionArgs } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-footer/workspace-footer.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-footer/workspace-footer.element.ts index f91a2858f4..a97ab40327 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-footer/workspace-footer.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-footer/workspace-footer.element.ts @@ -1,4 +1,4 @@ -import { UMB_SAVEABLE_WORKSPACE_CONTEXT } from '../../contexts/saveable-workspace.context-token.js'; +import { UMB_SAVEABLE_WORKSPACE_CONTEXT } from '../../contexts/tokens/saveable-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts index d30c8ea65e..d1dd0f8df1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts @@ -1,4 +1,4 @@ -import { UMB_WORKSPACE_COLLECTION_CONTEXT } from '../contexts/workspace-collection-context.token.js'; +import { UMB_WORKSPACE_COLLECTION_CONTEXT } from '../contexts/tokens/workspace-collection-context.token.js'; import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; import type { ManifestCondition, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts index d6b3439584..d9ad8d4856 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts @@ -1,5 +1,5 @@ -import { UMB_WORKSPACE_CONTEXT } from './workspace-context.token.js'; -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import { UMB_WORKSPACE_CONTEXT } from './tokens/workspace-context.token.js'; +import type { UmbWorkspaceContextInterface } from './tokens/workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/index.ts index 6c3697d84e..ebf0204607 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/index.ts @@ -1,15 +1,3 @@ export * from './default-workspace.context.js'; -export * from './editable-workspace-context-base.js'; -export * from './property-structure-workspace-context.interface.js'; -export * from './publishable-workspace-context.interface.js'; -export * from './publishable-workspace.context-token.js'; -export * from './routable-workspace-context.interface.js'; -export * from './saveable-workspace-context.interface.js'; -export * from './saveable-workspace.context-token.js'; -export * from './variant-workspace-context.token.js'; -export * from './workspace-collection-context.interface.js'; -export * from './workspace-collection-context.token.js'; -export * from './workspace-context.interface.js'; -export * from './workspace-context.token.js'; -export * from './workspace-invariantable-context.interface.js'; -export * from './workspace-variantable-context.interface.js'; +export * from './saveable-workspace-context-base.js'; +export * from './tokens/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/editable-workspace-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/editable-workspace-context-base.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts index 3aab9c5b0d..5ed3921a05 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/editable-workspace-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts @@ -1,13 +1,15 @@ -import { UMB_WORKSPACE_CONTEXT } from './workspace-context.token.js'; -import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; +import { UmbWorkspaceRouteManager } from '../controllers/workspace-route-manager.controller.js'; +import { UMB_WORKSPACE_CONTEXT } from './tokens/workspace-context.token.js'; +import type { UmbSaveableWorkspaceContextInterface } from './tokens/saveable-workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbModalContext } from '@umbraco-cms/backoffice/modal'; import { UMB_MODAL_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -export abstract class UmbEditableWorkspaceContextBase - extends UmbContextBase> +export abstract class UmbSaveableWorkspaceContextBase + extends UmbContextBase> implements UmbSaveableWorkspaceContextInterface { public readonly workspaceAlias: string; @@ -15,9 +17,13 @@ export abstract class UmbEditableWorkspaceContextBase // TODO: We could make a base type for workspace modal data, and use this here: As well as a base for the result, to make sure we always include the unique (instead of the object type) public readonly modalContext?: UmbModalContext<{ preset: object }>; + abstract readonly unique: Observable; + #isNew = new UmbBooleanState(undefined); isNew = this.#isNew.asObservable(); + readonly routes = new UmbWorkspaceRouteManager(this); + /* Concept notes: [NL] Considerations are, if we bring a dirty state (observable) we need to maintain it all the time. @@ -61,3 +67,11 @@ export abstract class UmbEditableWorkspaceContextBase abstract getData(): WorkspaceDataModelType | undefined; abstract save(): Promise; } + +/* + * @deprecated Use UmbSaveableWorkspaceContextBase instead — Will be removed before RC. + * TODO: Delete before RC. + */ +export abstract class UmbEditableWorkspaceContextBase< + WorkspaceDataModelType, +> extends UmbSaveableWorkspaceContextBase {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context.interface.ts deleted file mode 100644 index 1c3d095a31..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context.interface.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; -import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; - -export interface UmbSaveableWorkspaceContextInterface extends UmbWorkspaceContextInterface { - isNew: Observable; - getIsNew(): boolean | undefined; - save(): Promise; - setValidationErrors?(errorMap: any): void; // TODO: temp solution to bubble validation errors to the UI - destroy(): void; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts new file mode 100644 index 0000000000..dcac508623 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts @@ -0,0 +1,8 @@ +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; + +export interface UmbEntityWorkspaceContextInterface extends UmbWorkspaceContextInterface { + readonly unique: Observable; + getEntityType(): string; + getUnique(): string | undefined; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/index.ts new file mode 100644 index 0000000000..3d349ba1c3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/index.ts @@ -0,0 +1,13 @@ +export * from './publishable-workspace.context-token.js'; +export * from './saveable-workspace.context-token.js'; +export * from './variant-workspace-context.token.js'; +export * from './workspace-collection-context.token.js'; +export * from './workspace-context.token.js'; +export type * from './property-structure-workspace-context.interface.js'; +export type * from './publishable-workspace-context.interface.js'; +export type * from './routable-workspace-context.interface.js'; +export type * from './saveable-workspace-context.interface.js'; +export type * from './workspace-collection-context.interface.js'; +export type * from './workspace-context.interface.js'; +export type * from './invariant-dataset-workspace-context.interface.js'; +export type * from './variant-dataset-workspace-context.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-invariantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts similarity index 62% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-invariantable-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts index b9585fd07c..5f28e6be4e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-invariantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts @@ -1,10 +1,10 @@ -import type { UmbVariantId } from '../../variant/variant-id.class.js'; -import type { UmbPropertyDatasetContext } from '../../property/property-dataset/property-dataset-context.interface.js'; +import type { UmbVariantId } from '../../../variant/variant-id.class.js'; +import type { UmbPropertyDatasetContext } from '../../../property/property-dataset/property-dataset-context.interface.js'; import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -export interface UmbInvariantableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { +export interface UmbInvariantDatasetWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { // Name: name: Observable; getName(): string | undefined; @@ -17,3 +17,9 @@ export interface UmbInvariantableWorkspaceContextInterface extends UmbSaveableWo createPropertyDatasetContext(host: UmbControllerHost, variantId?: UmbVariantId): UmbPropertyDatasetContext; } + +/* + * @deprecated Use UmbInvariantWorkspaceContextInterface instead — Will be removed before RC. + * TODO: Delete before RC. + */ +export interface UmbInvariantableWorkspaceContextInterface extends UmbInvariantDatasetWorkspaceContextInterface {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/property-structure-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace-context.interface.ts similarity index 69% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/property-structure-workspace-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace-context.interface.ts index 7e8722c7cb..31f0cc5112 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/property-structure-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace-context.interface.ts @@ -1,7 +1,7 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbEntityWorkspaceContextInterface } from './entity-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { ValueModelBaseModel } from '@umbraco-cms/backoffice/external/backend-api'; -export interface UmbPropertyStructureWorkspaceContextInterface extends UmbWorkspaceContextInterface { +export interface UmbPropertyStructureWorkspaceContextInterface extends UmbEntityWorkspaceContextInterface { propertyStructureById(id: string): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/publishable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/publishable-workspace-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/publishable-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/publishable-workspace.context-token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/routable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace-context.interface.ts similarity index 77% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/routable-workspace-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace-context.interface.ts index c6a0a16e36..296c70efbc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/routable-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace-context.interface.ts @@ -1,4 +1,4 @@ -import type { UmbWorkspaceRouteManager } from '../index.js'; +import type { UmbWorkspaceRouteManager } from '../../index.js'; import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; export interface UmbRoutableWorkspaceContext extends UmbWorkspaceContextInterface { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace-context.interface.ts new file mode 100644 index 0000000000..24d4cd6a16 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace-context.interface.ts @@ -0,0 +1,12 @@ +import type { UmbEntityWorkspaceContextInterface } from './entity-workspace-context.interface.js'; +import type { UmbRoutableWorkspaceContext } from './routable-workspace-context.interface.js'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; + +export interface UmbSaveableWorkspaceContextInterface + extends UmbEntityWorkspaceContextInterface, + UmbRoutableWorkspaceContext { + isNew: Observable; + getIsNew(): boolean | undefined; + save(): Promise; + destroy(): void; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace.context-token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-variantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts similarity index 68% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-variantable-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts index 4f488e9d22..4897cb73ec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-variantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts @@ -1,11 +1,11 @@ -import type { UmbWorkspaceSplitViewManager } from '../controllers/workspace-split-view-manager.controller.js'; -import type { UmbPropertyDatasetContext } from '../../property/property-dataset/property-dataset-context.interface.js'; +import type { UmbWorkspaceSplitViewManager } from '../../controllers/workspace-split-view-manager.controller.js'; +import type { UmbPropertyDatasetContext } from '../../../property/property-dataset/property-dataset-context.interface.js'; import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbVariantId, UmbVariantModel, UmbVariantOptionModel } from '@umbraco-cms/backoffice/variant'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export interface UmbVariantableWorkspaceContextInterface +export interface UmbVariantDatasetWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { // Name: getName(variantId?: UmbVariantId): string | undefined; @@ -18,14 +18,19 @@ export interface UmbVariantableWorkspaceContextInterface( alias: string, variantId?: UmbVariantId, ): Promise | undefined>; getPropertyValue(alias: string, variantId?: UmbVariantId): ReturnValue | undefined; setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId): Promise; - //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; createPropertyDatasetContext(host: UmbControllerHost, variantId?: UmbVariantId): UmbPropertyDatasetContext; } + +/* + * @deprecated Use UmbVariantWorkspaceContextInterface instead — Will be removed before RC. + * TODO: Delete before RC. + */ +export interface UmbVariantableWorkspaceContextInterface extends UmbVariantDatasetWorkspaceContextInterface {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/variant-workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-workspace-context.token.ts similarity index 54% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/variant-workspace-context.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-workspace-context.token.ts index 562eabe48f..c510117fe3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/variant-workspace-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-workspace-context.token.ts @@ -1,12 +1,12 @@ import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; -import type { UmbVariantableWorkspaceContextInterface } from './workspace-variantable-context.interface.js'; +import type { UmbVariantDatasetWorkspaceContextInterface } from './variant-dataset-workspace-context.interface.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export const UMB_VARIANT_WORKSPACE_CONTEXT = new UmbContextToken< UmbWorkspaceContextInterface, - UmbVariantableWorkspaceContextInterface + UmbVariantDatasetWorkspaceContextInterface >( 'UmbWorkspaceContext', undefined, - (context): context is UmbVariantableWorkspaceContextInterface => 'variants' in context, + (context): context is UmbVariantDatasetWorkspaceContextInterface => 'variants' in context, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-collection-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-collection-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-collection-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-collection-context.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/workspace-context.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-is-new-redirect.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-is-new-redirect.controller.ts index 1157df8c8e..5bb0d8b2f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-is-new-redirect.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-is-new-redirect.controller.ts @@ -1,4 +1,4 @@ -import type { UmbEditableWorkspaceContextBase } from '../contexts/index.js'; +import type { UmbSaveableWorkspaceContextBase } from '../contexts/index.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { createRoutePathBuilder, type UmbRouterSlotElement } from '@umbraco-cms/backoffice/router'; @@ -16,7 +16,7 @@ import { ensurePathEndsWithSlash } from '@umbraco-cms/backoffice/utils'; export class UmbWorkspaceIsNewRedirectController extends UmbControllerBase { constructor( host: UmbControllerHost, - workspaceContext: UmbEditableWorkspaceContextBase, + workspaceContext: UmbSaveableWorkspaceContextBase, router: UmbRouterSlotElement, ) { super(host, 'isNewRedirectController'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts new file mode 100644 index 0000000000..0a825a1dbe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts @@ -0,0 +1,35 @@ +import type { UmbSaveableWorkspaceContextInterface } from '../../contexts/tokens/saveable-workspace-context.interface.js'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; + +@customElement('umb-editable-workspace') +export class UmbEditableWorkspaceElement extends UmbLitElement { + @state() + _routes: UmbRoute[] = []; + + public set api(api: UmbSaveableWorkspaceContextInterface) { + this.observe(api.routes.routes, (routes) => (this._routes = routes)); + + new UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'workspaceContext', [api]); + } + + // TODO: Should it be save, or should it be submit()? [NL] + render() { + return html` +
    + +
    +
    `; + } +} + +export default UmbEditableWorkspaceElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-editable-workspace': UmbEditableWorkspaceElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.kind.ts new file mode 100644 index 0000000000..81ddb39fda --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.kind.ts @@ -0,0 +1,13 @@ +import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifest: UmbBackofficeManifestKind = { + type: 'kind', + alias: 'Umb.Kind.Workspace.Editable', + matchKind: 'editable', + matchType: 'workspace', + manifest: { + type: 'workspace', + kind: 'editable', + element: () => import('./editable-workspace.element.js'), + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts new file mode 100644 index 0000000000..0935da84a5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts @@ -0,0 +1,22 @@ +import { expect, fixture, html } from '@open-wc/testing'; +import { UmbEditableWorkspaceElement } from './editable-workspace.element.js'; +import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; + +describe('UmbEditableWorkspaceElement', () => { + let element: UmbEditableWorkspaceElement; + + beforeEach(async () => { + element = await fixture(html``); + }); + + it('is defined with its own instance', () => { + expect(element).to.be.instanceOf(UmbEditableWorkspaceElement); + }); + + if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { + it('passes the a11y audit', async () => { + // TODO: should we use shadowDom here? + await expect(element).to.be.accessible(defaultA11yConfig); + }); + } +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/manifests.ts index 0c129d12fc..fb50387ddd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/manifests.ts @@ -1,3 +1,3 @@ -import { manifest as routableKindManifest } from './routable-workspace.kind.js'; +import { manifest as routableKindManifest } from './routable/routable-workspace.kind.js'; export const manifests = [routableKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable/routable-workspace.element.ts similarity index 89% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable-workspace.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable/routable-workspace.element.ts index b108b86b50..f87e29a9d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable/routable-workspace.element.ts @@ -1,4 +1,4 @@ -import type { UmbRoutableWorkspaceContext } from '../contexts/routable-workspace-context.interface.js'; +import type { UmbRoutableWorkspaceContext } from '../../contexts/tokens/routable-workspace-context.interface.js'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable-workspace.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable/routable-workspace.kind.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable-workspace.kind.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable/routable-workspace.kind.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable-workspace.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable/routable-workspace.test.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable-workspace.test.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/routable/routable-workspace.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts index 44ca0b1bc4..266f160333 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts @@ -3,13 +3,13 @@ import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import type { UmbInvariantableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbInvariantDatasetWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; /** * A property dataset context that hooks directly into the workspace context. */ export class UmbInvariantWorkspacePropertyDatasetContext< - WorkspaceType extends UmbInvariantableWorkspaceContextInterface = UmbInvariantableWorkspaceContextInterface, + WorkspaceType extends UmbInvariantDatasetWorkspaceContextInterface = UmbInvariantDatasetWorkspaceContextInterface, > extends UmbContextBase implements UmbPropertyDatasetContext, UmbNameablePropertyDatasetContext diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace-editor.element.ts index 62896e5616..49e488c69f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace-editor.element.ts @@ -23,7 +23,7 @@ export class UmbDataTypeWorkspaceEditorElement extends UmbLitElement { this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (workspaceContext) => { this.#workspaceContext = workspaceContext; - this.#workspaceContext?.createPropertyDatasetContext(this); + this.#workspaceContext.createPropertyDatasetContext(this); this.#observeIsNew(); this.#observeName(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts index 63c6a5f1a2..b906f2a538 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts @@ -3,11 +3,11 @@ import type { UmbDataTypeDetailModel } from '../types.js'; import { UmbDataTypeWorkspaceEditorElement } from './data-type-workspace-editor.element.js'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import type { - UmbInvariantableWorkspaceContextInterface, + UmbInvariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbInvariantWorkspacePropertyDatasetContext, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, @@ -32,8 +32,8 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice type EntityType = UmbDataTypeDetailModel; export class UmbDataTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase - implements UmbInvariantableWorkspaceContextInterface, UmbRoutableWorkspaceContext + extends UmbSaveableWorkspaceContextBase + implements UmbInvariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext { // public readonly repository: UmbDataTypeDetailRepository = new UmbDataTypeDetailRepository(this); @@ -345,6 +345,11 @@ export class UmbDataTypeWorkspaceContext this.workspaceComplete(this.#currentData.value); } + protected workspaceComplete(data: EntityType | undefined) { + this.dispatchEvent(new CustomEvent('workspace-complete')); + super.workspaceComplete(data); + } + async delete(unique: string) { await this.repository.delete(unique); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts index 83440198b3..62d6828757 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts @@ -3,7 +3,7 @@ import type { UmbDictionaryDetailModel } from '../types.js'; import { UmbDictionaryWorkspaceEditorElement } from './dictionary-workspace-editor.element.js'; import { type UmbSaveableWorkspaceContextInterface, - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, type UmbRoutableWorkspaceContext, @@ -15,7 +15,7 @@ import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/event'; export class UmbDictionaryWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { // @@ -26,6 +26,7 @@ export class UmbDictionaryWorkspaceContext #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); + readonly unique = this.#data.asObservablePart((data) => data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name); readonly dictionary = this.#data.asObservablePart((data) => data); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index fc3265ddd1..55724005fe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -4,7 +4,7 @@ import type { UmbDocumentTypeDetailModel } from '../types.js'; import { UmbDocumentTypeWorkspaceEditorElement } from './document-type-workspace-editor.element.js'; import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, type UmbRoutableWorkspaceContext, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, @@ -23,7 +23,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice type EntityType = UmbDocumentTypeDetailModel; export class UmbDocumentTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbContentTypeWorkspaceContext, UmbRoutableWorkspaceContext { readonly IS_CONTENT_TYPE_WORKSPACE_CONTEXT = true; @@ -36,6 +36,7 @@ export class UmbDocumentTypeWorkspaceContext // General for content types: //readonly data; + readonly unique; readonly name; readonly alias; readonly description; @@ -62,6 +63,7 @@ export class UmbDocumentTypeWorkspaceContext // General for content types: //this.data = this.structure.ownerContentType; + this.unique = this.structure.ownerContentTypeObservablePart((data) => data?.unique); this.name = this.structure.ownerContentTypeObservablePart((data) => data?.name); this.alias = this.structure.ownerContentTypeObservablePart((data) => data?.alias); this.description = this.structure.ownerContentTypeObservablePart((data) => data?.description); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 50abd6196a..61d28a3b43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -22,14 +22,14 @@ import { UmbDocumentWorkspaceEditorElement } from './document-workspace-editor.e import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, UmbWorkspaceSplitViewManager, } from '@umbraco-cms/backoffice/workspace'; import type { UmbWorkspaceCollectionContextInterface, - UmbVariantableWorkspaceContextInterface, + UmbVariantDatasetWorkspaceContextInterface, UmbPublishableWorkspaceContextInterface, UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; @@ -51,10 +51,10 @@ import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/documen type EntityType = UmbDocumentDetailModel; export class UmbDocumentWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbRoutableWorkspaceContext, - UmbVariantableWorkspaceContextInterface, + UmbVariantDatasetWorkspaceContextInterface, UmbPublishableWorkspaceContextInterface, UmbWorkspaceCollectionContextInterface { diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts index c25d16beba..3175d28fb9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts @@ -3,23 +3,23 @@ import type { UmbLanguageDetailModel } from '../../types.js'; import { UmbLanguageWorkspaceEditorElement } from './language-workspace-editor.element.js'; import { type UmbSaveableWorkspaceContextInterface, - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, type UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; -import { ApiError } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbLanguageWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { public readonly repository: UmbLanguageDetailRepository = new UmbLanguageDetailRepository(this); #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); + readonly unique = this.#data.asObservablePart((x) => x?.unique); // TODO: this is a temp solution to bubble validation errors to the UI #validationErrors = new UmbObjectState(undefined); @@ -111,30 +111,17 @@ export class UmbLanguageWorkspaceContext this.#data.update({ fallbackIsoCode: unique }); } - // TODO: this is a temp solution to bubble validation errors to the UI - setValidationErrors(errorMap: any) { - // TODO: I can't use the update method to set the value to undefined - this.#validationErrors.setValue(errorMap); - } - async save() { - const data = this.getData(); - if (!data) return; + const newData = this.getData(); + if (!newData) return; if (this.getIsNew()) { - const { error } = await this.repository.create(data); - // TODO: this is temp solution to bubble validation errors to the UI - if (error) { - if (error instanceof ApiError && error.body.type === 'validation') { - this.setValidationErrors?.(error.body.errors); - } - } else { - this.setValidationErrors?.(undefined); - // TODO: do not make it the buttons responsibility to set the workspace to not new. + const { data } = await this.repository.create(newData); + if (data) { this.setIsNew(false); } } else { - await this.repository.save(data); + await this.repository.save(newData); // TODO: Show validation errors as warnings? } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/views/language-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/views/language-details-workspace-view.element.ts index 1645e22d54..259a7751b4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/views/language-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/views/language-details-workspace-view.element.ts @@ -22,9 +22,6 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement implem @state() _isNew?: boolean; - @state() - _validationErrors?: { [key: string]: Array }; - #languageWorkspaceContext?: typeof UMB_LANGUAGE_WORKSPACE_CONTEXT.TYPE; constructor() { @@ -52,11 +49,6 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement implem this.observe(this.#languageWorkspaceContext.isNew, (isNew) => { this._isNew = isNew; }); - - this.observe(this.#languageWorkspaceContext.validationErrors, (value) => { - this._validationErrors = value; - this.requestUpdate('_validationErrors'); - }); }); } @@ -123,9 +115,6 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement implem value=${ifDefined(this._language?.unique)} @change=${this.#handleCultureChange} ?readonly=${this._isNew === false}> - - - ${this._validationErrors?.isoCode.map((error) => html`
    ${error}
    `)} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts index f28eb8b625..7f066464d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts @@ -3,7 +3,7 @@ import { UMB_MEDIA_TYPE_ENTITY_TYPE } from '../entity.js'; import type { UmbMediaTypeDetailModel } from '../types.js'; import { UmbMediaTypeWorkspaceEditorElement } from './media-type-workspace-editor.element.js'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, type UmbRoutableWorkspaceContext, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, @@ -23,7 +23,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice type EntityType = UmbMediaTypeDetailModel; export class UmbMediaTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbContentTypeWorkspaceContext, UmbRoutableWorkspaceContext { readonly IS_CONTENT_TYPE_WORKSPACE_CONTEXT = true; @@ -36,6 +36,7 @@ export class UmbMediaTypeWorkspaceContext // General for content types: readonly data; + readonly unique; readonly name; readonly alias; readonly description; @@ -56,6 +57,7 @@ export class UmbMediaTypeWorkspaceContext // General for content types: this.data = this.structure.ownerContentType; + this.unique = this.structure.ownerContentTypeObservablePart((data) => data?.unique); this.name = this.structure.ownerContentTypeObservablePart((data) => data?.name); this.alias = this.structure.ownerContentTypeObservablePart((data) => data?.alias); this.description = this.structure.ownerContentTypeObservablePart((data) => data?.description); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index b2ec225c93..a00622e98f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -7,10 +7,10 @@ import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/var import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import type { UmbWorkspaceCollectionContextInterface, - UmbVariantableWorkspaceContextInterface, + UmbVariantDatasetWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, UmbWorkspaceSplitViewManager, @@ -33,8 +33,10 @@ import UmbMediaWorkspaceEditorElement from './media-workspace-editor.element.js' type EntityType = UmbMediaDetailModel; export class UmbMediaWorkspaceContext - extends UmbEditableWorkspaceContextBase - implements UmbVariantableWorkspaceContextInterface, UmbWorkspaceCollectionContextInterface + extends UmbSaveableWorkspaceContextBase + implements + UmbVariantDatasetWorkspaceContextInterface, + UmbWorkspaceCollectionContextInterface { // public readonly repository = new UmbMediaDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts index 1d69d6a74b..cf20bd3a20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts @@ -4,7 +4,7 @@ import { UMB_MEMBER_GROUP_WORKSPACE_ALIAS } from './manifests.js'; import { UmbMemberGroupWorkspaceEditorElement } from './member-group-workspace-editor.element.js'; import { type UmbSaveableWorkspaceContextInterface, - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, type UmbRoutableWorkspaceContext, @@ -13,7 +13,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; export class UmbMemberGroupWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { public readonly repository = new UmbMemberGroupDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts index cc01f5917a..a587aebd59 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts @@ -3,7 +3,7 @@ import type { UmbMemberTypeDetailModel } from '../types.js'; import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../index.js'; import { UmbMemberTypeWorkspaceEditorElement } from './member-type-workspace-editor.element.js'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, type UmbRoutableWorkspaceContext, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, @@ -21,7 +21,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice type EntityType = UmbMemberTypeDetailModel; export class UmbMemberTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbContentTypeWorkspaceContext, UmbRoutableWorkspaceContext { readonly IS_CONTENT_TYPE_WORKSPACE_CONTEXT = true; @@ -32,6 +32,7 @@ export class UmbMemberTypeWorkspaceContext // General for content types: readonly data; + readonly unique; readonly name; readonly alias; readonly description; @@ -52,6 +53,7 @@ export class UmbMemberTypeWorkspaceContext // General for content types: this.data = this.structure.ownerContentType; + this.unique = this.structure.ownerContentTypeObservablePart((data) => data?.unique); this.name = this.structure.ownerContentTypeObservablePart((data) => data?.name); this.alias = this.structure.ownerContentTypeObservablePart((data) => data?.alias); this.description = this.structure.ownerContentTypeObservablePart((data) => data?.description); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts index 5afc5fff60..7a51542a8f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts @@ -5,14 +5,14 @@ import { UMB_MEMBER_WORKSPACE_ALIAS } from './manifests.js'; import { UmbMemberWorkspaceEditorElement } from './member-workspace-editor.element.js'; import { UmbMemberTypeDetailRepository } from '@umbraco-cms/backoffice/member-type'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, UmbWorkspaceSplitViewManager, } from '@umbraco-cms/backoffice/workspace'; import type { UmbRoutableWorkspaceContext, - UmbVariantableWorkspaceContextInterface, + UmbVariantDatasetWorkspaceContextInterface, UmbWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -30,9 +30,9 @@ import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; type EntityType = UmbMemberDetailModel; export class UmbMemberWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements - UmbVariantableWorkspaceContextInterface, + UmbVariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext, UmbWorkspaceContextInterface { @@ -52,6 +52,7 @@ export class UmbMemberWorkspaceContext } readonly data = this.#currentData.asObservable(); + readonly unique = this.#currentData.asObservablePart((data) => data?.unique); readonly name = this.#currentData.asObservablePart((data) => data?.variants[0].name); readonly createDate = this.#currentData.asObservablePart((data) => data?.variants[0].createDate); readonly updateDate = this.#currentData.asObservablePart((data) => data?.variants[0].updateDate); @@ -65,8 +66,6 @@ export class UmbMemberWorkspaceContext readonly variants = this.#currentData.asObservablePart((data) => data?.variants ?? []); - readonly unique = this.#currentData.asObservablePart((data) => data?.unique); - readonly routes = new UmbWorkspaceRouteManager(this); readonly splitView = new UmbWorkspaceSplitViewManager(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts index 93784537b1..7ad1f62a4a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbRelationTypeRepository } from '../repository/relation-type.repositor import { UmbRelationTypeWorkspaceEditorElement } from './relation-type-workspace-editor.element.js'; import { type UmbSaveableWorkspaceContextInterface, - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, type UmbRoutableWorkspaceContext, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, @@ -12,7 +12,7 @@ import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbRelationTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { // @@ -22,6 +22,7 @@ export class UmbRelationTypeWorkspaceContext #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); + readonly unique = this.#data.asObservablePart((data) => data?.id); readonly name = this.#data.asObservablePart((data) => data?.name); readonly id = this.#data.asObservablePart((data) => data?.id); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts index 764f7623d9..0bb2c2e2a8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts @@ -9,7 +9,7 @@ import type { UmbSaveableWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; @@ -22,7 +22,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router'; export class UmbPartialViewWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { public readonly repository = new UmbPartialViewDetailRepository(this); @@ -31,6 +31,7 @@ export class UmbPartialViewWorkspaceContext #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); + readonly unique = this.#data.asObservablePart((data) => data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name); readonly content = this.#data.asObservablePart((data) => data?.content); readonly path = this.#data.asObservablePart((data) => data?.path); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts index ea0c25b340..60564ba5e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts @@ -6,7 +6,7 @@ import { UmbScriptWorkspaceEditorElement } from './script-workspace-editor.eleme import { UmbBooleanState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, type UmbRoutableWorkspaceContext, type UmbSaveableWorkspaceContextInterface, UmbWorkspaceIsNewRedirectController, @@ -19,7 +19,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router'; export class UmbScriptWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { public readonly repository = new UmbScriptDetailRepository(this); @@ -28,6 +28,7 @@ export class UmbScriptWorkspaceContext #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); + readonly unique = this.#data.asObservablePart((data) => data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name); readonly content = this.#data.asObservablePart((data) => data?.content); readonly path = this.#data.asObservablePart((data) => data?.path); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index db162fac11..80726a7ab6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -5,7 +5,7 @@ import { UMB_STYLESHEET_WORKSPACE_ALIAS } from './manifests.js'; import { UmbStylesheetWorkspaceEditorElement } from './stylesheet-workspace-editor.element.js'; import { type UmbSaveableWorkspaceContextInterface, - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, type UmbRoutableWorkspaceContext, @@ -19,7 +19,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router'; export class UmbStylesheetWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { public readonly repository = new UmbStylesheetDetailRepository(this); @@ -28,6 +28,7 @@ export class UmbStylesheetWorkspaceContext #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); + readonly unique = this.#data.asObservablePart((data) => data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name); readonly content = this.#data.asObservablePart((data) => data?.content); readonly path = this.#data.asObservablePart((data) => data?.path); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts index 2461875df8..0809f1a8dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts @@ -9,7 +9,7 @@ import type { UmbSaveableWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; @@ -21,7 +21,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router'; export class UmbTemplateWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { public readonly detailRepository = new UmbTemplateDetailRepository(this); @@ -36,7 +36,7 @@ export class UmbTemplateWorkspaceContext name = this.#data.asObservablePart((data) => data?.name); alias = this.#data.asObservablePart((data) => data?.alias); content = this.#data.asObservablePart((data) => data?.content); - unique = this.#data.asObservablePart((data) => data?.unique); + readonly unique = this.#data.asObservablePart((data) => data?.unique); masterTemplateUnique = this.#data.asObservablePart((data) => data?.masterTemplate?.unique); #isCodeEditorReady = new UmbBooleanState(false); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index 19cfa3752e..9111a48899 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -7,7 +7,7 @@ import type { UmbSaveableWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import { - UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; @@ -15,7 +15,7 @@ import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbUserGroupWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext { // @@ -24,6 +24,7 @@ export class UmbUserGroupWorkspaceContext #data = new UmbObjectState(undefined); data = this.#data.asObservable(); + readonly unique = this.#data.asObservablePart((data) => data?.unique); readonly name = this.#data.asObservablePart((data) => data?.name || ''); readonly icon = this.#data.asObservablePart((data) => data?.icon || null); readonly sections = this.#data.asObservablePart((data) => data?.sections || []); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts index 744a84767e..8c91a4c436 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts @@ -5,14 +5,14 @@ import { UmbUserAvatarRepository } from '../repository/avatar/index.js'; import { UMB_USER_WORKSPACE_ALIAS } from './manifests.js'; import { UmbUserWorkspaceEditorElement } from './user-workspace-editor.element.js'; import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; -import { UmbEditableWorkspaceContextBase, UmbWorkspaceRouteManager } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; type EntityType = UmbUserDetailModel; export class UmbUserWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbSaveableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface { public readonly detailRepository: UmbUserDetailRepository = new UmbUserDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 364077e447..33bf53145e 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -101,6 +101,7 @@ "@umbraco-cms/backoffice/user-permission": ["./src/packages/user/user-permission/index.ts"], "@umbraco-cms/backoffice/user": ["./src/packages/user/user/index.ts"], "@umbraco-cms/backoffice/utils": ["./src/packages/core/utils/index.ts"], + "@umbraco-cms/backoffice/validation": ["./src/packages/core/validation/index.ts"], "@umbraco-cms/backoffice/variant": ["./src/packages/core/variant/index.ts"], "@umbraco-cms/backoffice/webhook": ["./src/packages/webhook/index.ts"], "@umbraco-cms/backoffice/workspace": ["./src/packages/core/workspace/index.ts"], From e6d0c60ed0362d77fb8e2f7f0b678854ae24cfae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 08:41:12 +0100 Subject: [PATCH 08/29] rename collection workspace interface --- .../tokens/workspace-collection-context.interface.ts | 10 +++++++++- .../tokens/workspace-collection-context.token.ts | 8 ++++---- .../documents/workspace/document-workspace.context.ts | 4 ++-- .../media/media/workspace/media-workspace.context.ts | 4 ++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts index e60933172a..e42888046b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts @@ -2,9 +2,17 @@ import type { UmbWorkspaceContextInterface } from './workspace-context.interface import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbContentTypeModel, UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; -export interface UmbWorkspaceCollectionContextInterface +export interface UmbCollectionWorkspaceContextInterface extends UmbWorkspaceContextInterface { contentTypeHasCollection: Observable; getCollectionAlias(): string; structure: UmbContentTypeStructureManager; } + +/** + * @deprecated Use UmbCollectionWorkspaceContextInterface instead — Will be removed before RC. + * TODO: Delete before RC. + */ +export interface UmbWorkspaceCollectionContextInterface + extends UmbCollectionWorkspaceContextInterface + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.token.ts index 4cc4ba1460..b52145e403 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.token.ts @@ -2,15 +2,15 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; import type { UmbWorkspaceContextInterface, - UmbWorkspaceCollectionContextInterface, + UmbCollectionWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; export const UMB_WORKSPACE_COLLECTION_CONTEXT = new UmbContextToken< UmbWorkspaceContextInterface, - UmbWorkspaceCollectionContextInterface + UmbCollectionWorkspaceContextInterface >( 'UmbWorkspaceContext', undefined, - (context): context is UmbWorkspaceCollectionContextInterface => - (context as UmbWorkspaceCollectionContextInterface).contentTypeHasCollection !== undefined, + (context): context is UmbCollectionWorkspaceContextInterface => + (context as UmbCollectionWorkspaceContextInterface).contentTypeHasCollection !== undefined, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 61d28a3b43..abb330b1b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -28,7 +28,7 @@ import { UmbWorkspaceSplitViewManager, } from '@umbraco-cms/backoffice/workspace'; import type { - UmbWorkspaceCollectionContextInterface, + UmbCollectionWorkspaceContextInterface, UmbVariantDatasetWorkspaceContextInterface, UmbPublishableWorkspaceContextInterface, UmbRoutableWorkspaceContext, @@ -56,7 +56,7 @@ export class UmbDocumentWorkspaceContext UmbRoutableWorkspaceContext, UmbVariantDatasetWorkspaceContextInterface, UmbPublishableWorkspaceContextInterface, - UmbWorkspaceCollectionContextInterface + UmbCollectionWorkspaceContextInterface { public readonly repository = new UmbDocumentDetailRepository(this); public readonly publishingRepository = new UmbDocumentPublishingRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index a00622e98f..86fedb04a4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -6,7 +6,7 @@ import type { UmbMediaDetailModel, UmbMediaVariantModel, UmbMediaVariantOptionMo import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import type { - UmbWorkspaceCollectionContextInterface, + UmbCollectionWorkspaceContextInterface, UmbVariantDatasetWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import { @@ -36,7 +36,7 @@ export class UmbMediaWorkspaceContext extends UmbSaveableWorkspaceContextBase implements UmbVariantDatasetWorkspaceContextInterface, - UmbWorkspaceCollectionContextInterface + UmbCollectionWorkspaceContextInterface { // public readonly repository = new UmbMediaDetailRepository(this); From ad386e3d66f6e1d6418cca60479fe012924aecf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 09:32:38 +0100 Subject: [PATCH 09/29] files for validation context --- .../src/packages/core/validation/context/index.ts | 2 ++ .../core/validation/context/vaidation.context-token.ts | 3 +++ .../packages/core/validation/context/vaidation.context.ts | 8 ++++++++ .../invariant-dataset-workspace-context.interface.ts | 2 +- .../tokens/variant-dataset-workspace-context.interface.ts | 2 +- .../tokens/workspace-collection-context.interface.ts | 3 +-- 6 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/context/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/index.ts new file mode 100644 index 0000000000..99311cb3cf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/index.ts @@ -0,0 +1,2 @@ +export * from './validation.context.js'; +export * from './validation.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context-token.ts new file mode 100644 index 0000000000..7ddf4a218b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context-token.ts @@ -0,0 +1,3 @@ +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_VALIDATION_CONTEXT = new UmbContextToken('UmbValidationContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context.ts new file mode 100644 index 0000000000..0e8fd21e78 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context.ts @@ -0,0 +1,8 @@ +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbValidationContext extends UmbContextBase { + constructor(host: UmbControllerHost) { + super(host, UMB_VALIDATION_CONTEXT); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts index 5f28e6be4e..0105bc08e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts @@ -18,7 +18,7 @@ export interface UmbInvariantDatasetWorkspaceContextInterface extends UmbSaveabl createPropertyDatasetContext(host: UmbControllerHost, variantId?: UmbVariantId): UmbPropertyDatasetContext; } -/* +/** * @deprecated Use UmbInvariantWorkspaceContextInterface instead — Will be removed before RC. * TODO: Delete before RC. */ diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts index 4897cb73ec..af17e2858c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts @@ -29,7 +29,7 @@ export interface UmbVariantDatasetWorkspaceContextInterface - extends UmbCollectionWorkspaceContextInterface - + extends UmbCollectionWorkspaceContextInterface {} From 154b0506320902463db1825c1dbfb6ba6026c62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 09:32:53 +0100 Subject: [PATCH 10/29] export --- src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts index c26329177e..807bd98e24 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/index.ts @@ -1,2 +1,3 @@ export * from './events/index.js'; export * from './mixins/index.js'; +export * from './context/index.js'; From b887379917d969e3b77592370e40c0795a4c2bee Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:56:32 +0100 Subject: [PATCH 11/29] requesticon --- .../ref-data-type/ref-data-type.element.ts | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index fa6f3d3fe1..04feb80560 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -1,8 +1,7 @@ import { UmbDataTypeDetailRepository } from '../../repository/detail/data-type-detail.repository.js'; -import { UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; +import { UUIIconRequestEvent, UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import { UmbIconRegistry } from '@umbraco-cms/backoffice/icon'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; /** @@ -12,27 +11,10 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registr */ @customElement('umb-ref-data-type') export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { - #iconRegistry = new UmbIconRegistry(); // TODO Can we access the icon registry from UmbAppElement? - //icon-circle-dotted.svg - #svg = ``; - @state() - protected fallbackIcon = this.#svg; - - async #getIconFromRegistry() { - this.observe( - umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), - async (manifestPropertyEditorUi) => { - const icon = await this.#iconRegistry.getIcon(manifestPropertyEditorUi?.meta.icon ?? ''); - if (icon) { - this.fallbackIcon = icon; - } else { - this.fallbackIcon = this.#svg; - } - }, - ), - '_observeIcon'; - } + protected fallbackIcon = + ``; + //icon-circle-dotted.svg @property({ type: String, attribute: 'data-type-id' }) public get dataTypeId(): string | undefined { @@ -75,6 +57,33 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { @state() propertyEditorSchemaAlias = ''; + async #getIconFromRegistry() { + this.observe( + umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), + async (manifestPropertyEditorUi) => { + const icon = manifestPropertyEditorUi?.meta.icon; + if (icon) { + this.#requestIcon(icon); + } + }, + ), + '_observeIcon'; + } + + #requestIcon(iconName: string) { + if (iconName !== '' && iconName !== null) { + const event = new UUIIconRequestEvent(UUIIconRequestEvent.ICON_REQUEST, { + detail: { iconName: iconName }, + }); + this.dispatchEvent(event); + if (event.icon !== null) { + event.icon.then((iconSvg: string) => { + this.fallbackIcon = iconSvg; + }); + } + } + } + protected renderDetail() { const details: string[] = []; From 1d61e917ad1e7b5d59c2cb1ebbb35ea4749dc3b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 09:58:46 +0100 Subject: [PATCH 12/29] correct file names --- .../components/input-number-range/input-number-range.element.ts | 2 +- .../{vaidation.context-token.ts => validation.context-token.ts} | 0 .../context/{vaidation.context.ts => validation.context.ts} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename src/Umbraco.Web.UI.Client/src/packages/core/validation/context/{vaidation.context-token.ts => validation.context-token.ts} (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/validation/context/{vaidation.context.ts => validation.context.ts} (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts index 7a1dc8c7fa..c045356423 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts @@ -1,5 +1,5 @@ import { UmbFormControlMixin } from '@umbraco-cms/backoffice/validation'; -import { html, customElement, property, state, PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, property, state, type PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; function getNumberOrUndefined(value: string) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context-token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context-token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/validation/context/vaidation.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context.ts From f33c59401a22f78a062f12bab1d528d5076eb3fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 10:04:31 +0100 Subject: [PATCH 13/29] mixin correction --- .../packages/core/validation/mixins/form-control.mixin.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts index 3009882074..dd9368a7f8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts @@ -134,7 +134,7 @@ export const UmbFormControlMixin = < super(...args); this._internals = this.attachInternals(); - this.addEventListener('focusout', () => { + this.addEventListener('blur', () => { this.pristine = false; this.checkValidity(); }); @@ -198,12 +198,12 @@ export const UmbFormControlMixin = < */ protected addFormControlElement(element: NativeFormControlElement) { this.#formCtrlElements.push(element); - /*element.addEventListener(UmbValidationInvalidEvent.TYPE, () => { + element.addEventListener(UmbValidationInvalidEvent.TYPE, () => { this._runValidators(); }); element.addEventListener(UmbValidationValidEvent.TYPE, () => { this._runValidators(); - });*/ + }); } /** @@ -241,10 +241,8 @@ export const UmbFormControlMixin = < this._validityState.valid = !hasError; if (hasError) { - console.log('HAS ERROR', this.validationMessage, this.pristine); this.dispatchEvent(new UmbValidationInvalidEvent()); } else { - console.log('IS VALID', this.validationMessage, this.pristine); this._internals.setValidity({}); this.dispatchEvent(new UmbValidationValidEvent()); } From f89cf68f6e6c6dc4c85515f276b81b70eb6f1d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 10:06:06 +0100 Subject: [PATCH 14/29] remove call to run validations --- .../components/input-number-range/input-number-range.element.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts index c045356423..fca19679e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts @@ -78,7 +78,6 @@ export class UmbInputNumberRangeElement extends UmbFormControlMixin(UmbLitElemen private _onMaxInput(e: InputEvent) { this.maxValue = Number((e.target as HTMLInputElement).value); this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); - this._runValidators(); } render() { From 4140ec10c02d58016f374779ffcd8bec5a6f9aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 11:10:56 +0100 Subject: [PATCH 15/29] workspace interfaces and tokens --- .../localization/localize-date.element.ts | 8 +++--- .../src/packages/core/models/index.ts | 2 ++ ...perty-editor-ui-collection-view.element.ts | 5 ++-- .../property-editor-ui-tree-picker.element.ts | 4 +-- .../property-dataset-context.interface.ts | 3 ++- .../workspace-entity-action-menu.element.ts | 8 +++--- .../contexts/default-workspace.context.ts | 2 +- .../saveable-workspace-context-base.ts | 2 +- ...collection-workspace-context.interface.ts} | 4 +-- ... => collection-workspace.context-token.ts} | 0 .../entity-workspace-context.interface.ts | 6 ++--- .../tokens/entity-workspace.context-token.ts | 12 +++++++++ .../core/workspace/contexts/tokens/index.ts | 15 ++++++----- ...perty-structure-workspace.context-token.ts | 12 +++++++++ .../publishable-workspace.context-token.ts | 6 ++--- .../routable-workspace.context-token.ts | 8 ++++++ .../saveable-workspace.context-token.ts | 8 +++--- ....ts => variant-workspace.context-token.ts} | 0 .../tokens/workspace-context.interface.ts | 1 - ...xt.token.ts => workspace.context-token.ts} | 0 .../src/packages/core/workspace/index.ts | 3 ++- .../editable/editable-workspace.element.ts | 3 +-- .../src/packages/core/workspace/types.ts | 1 + ...nt-type-workspace-view-settings.element.ts | 15 ++++++----- ...t-type-workspace-view-structure.element.ts | 4 +-- ...t-type-workspace-view-templates.element.ts | 4 +-- .../document-workspace-view-info.element.ts | 13 ++++++---- .../workspace/logviewer-workspace.context.ts | 5 ---- .../media-type-workspace-editor.element.ts | 6 ++--- ...a-type-workspace-view-structure.element.ts | 6 ++--- .../info/media-workspace-view-info.element.ts | 9 +++---- ...member-type-workspace-view-info.element.ts | 9 +++---- .../workspace/member-workspace.context.ts | 6 +---- ...mber-workspace-view-member-info.element.ts | 9 +++---- .../src/packages/templating/scripts/index.ts | 1 + .../script-workspace-editor.element.ts | 25 +++++++++---------- .../script-workspace.context-token.ts | 12 +++++++++ .../stylesheet-workspace-editor.element.ts | 9 +++---- ...t-rich-text-rule-workspace-view.element.ts | 9 +++---- .../user-workspace-editor.element.ts | 6 ++--- .../webhook/webhook-workspace.context.ts | 4 --- 41 files changed, 151 insertions(+), 114 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/{workspace-collection-context.interface.ts => collection-workspace-context.interface.ts} (82%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/{workspace-collection-context.token.ts => collection-workspace.context-token.ts} (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace.context-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace.context-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace.context-token.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/{variant-workspace-context.token.ts => variant-workspace.context-token.ts} (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/{workspace-context.token.ts => workspace.context-token.ts} (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-date.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-date.element.ts index fbddbaeccb..9d8238aec2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-date.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize-date.element.ts @@ -13,20 +13,20 @@ export class UmbLocalizeDateElement extends UmbLitElement { * @attr * @example date="Sep 22 2023" */ - @property() - date!: string | Date; + @property({ type: String }) + date?: string | Date; /** * Formatting options * @attr * @example options={ dateStyle: 'full', timeStyle: 'long', timeZone: 'Australia/Sydney' } */ - @property() + @property({ type: Object }) options?: Intl.DateTimeFormatOptions; @state() protected get text(): string { - return this.localize.date(this.date, this.options); + return this.localize.date(this.date!, this.options); } protected render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/models/index.ts index 443a993919..e546f7df28 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/models/index.ts @@ -1,3 +1,5 @@ +export type UmbEntityUnique = string | null; + /** Tried to find a common base of our entities — used by Entity Workspace Context */ export type UmbEntityBase = { id?: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/collection-view/property-editor-ui-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/collection-view/property-editor-ui-collection-view.element.ts index b423bf9ebb..62a1a1d7e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/collection-view/property-editor-ui-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/collection-view/property-editor-ui-collection-view.element.ts @@ -39,8 +39,9 @@ export class UmbPropertyEditorUICollectionViewElement extends UmbLitElement impl if (propertyAlias) { // Gets the Data Type ID for the current property. const property = await workspaceContext.structure.getPropertyStructureByAlias(propertyAlias); - if (property && this._config) { - this._config.unique = workspaceContext.getUnique(); + const unique = workspaceContext.getUnique(); + if (unique && property && this._config) { + this._config.unique = unique; this._config.dataTypeId = property.dataType.unique; this.requestUpdate('_config'); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/tree-picker/property-editor-ui-tree-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/tree-picker/property-editor-ui-tree-picker.element.ts index a8e13e3fbd..490b0e6a1f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/tree-picker/property-editor-ui-tree-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/tree-picker/property-editor-ui-tree-picker.element.ts @@ -2,7 +2,7 @@ import { html, customElement, property, state } from '@umbraco-cms/backoffice/ex import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbPropertyValueChangeEvent } from '@umbraco-cms/backoffice/property-editor'; import { UmbDynamicRootRepository } from '@umbraco-cms/backoffice/dynamic-root'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbInputTreeElement } from '@umbraco-cms/backoffice/tree'; @@ -69,7 +69,7 @@ export class UmbPropertyEditorUITreePickerElement extends UmbLitElement implemen // TODO: Awaiting the workspace context to have a parent entity ID value. [LK] // e.g. const parentEntityId = this.#workspaceContext?.getParentEntityId(); - const workspaceContext = await this.getContext(UMB_WORKSPACE_CONTEXT); + const workspaceContext = await this.getContext(UMB_ENTITY_WORKSPACE_CONTEXT); const unique = workspaceContext.getUnique(); if (unique && this.#dynamicRoot) { const result = await this.#dynamicRootRepository.postDynamicRootQuery(this.#dynamicRoot, unique); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-dataset/property-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-dataset/property-dataset-context.interface.ts index e6523ce269..f4f41bda12 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-dataset/property-dataset-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-dataset/property-dataset-context.interface.ts @@ -1,6 +1,7 @@ import type { UmbVariantId } from '../../variant/variant-id.class.js'; import type { UmbContext } from '@umbraco-cms/backoffice/class-api'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import type { UmbEntityUnique } from '@umbraco-cms/backoffice/models'; /** * A property dataset context, represents the data of a set of properties. @@ -18,7 +19,7 @@ import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; */ export interface UmbPropertyDatasetContext extends UmbContext { getEntityType(): string; - getUnique(): string | undefined; + getUnique(): UmbEntityUnique | undefined; getVariantId: () => UmbVariantId; getName(): string | undefined; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-entity-action-menu/workspace-entity-action-menu.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-entity-action-menu/workspace-entity-action-menu.element.ts index 3cab2661db..c0d6c00d1c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-entity-action-menu/workspace-entity-action-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-entity-action-menu/workspace-entity-action-menu.element.ts @@ -2,14 +2,14 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state, nothing, query } from '@umbraco-cms/backoffice/external/lit'; import type { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UMB_ENTITY_WORKSPACE_CONTEXT, type UmbWorkspaceUniqueType } from '@umbraco-cms/backoffice/workspace'; import type { UUIPopoverContainerElement } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-workspace-entity-action-menu') export class UmbWorkspaceEntityActionMenuElement extends UmbLitElement { - private _workspaceContext?: typeof UMB_WORKSPACE_CONTEXT.TYPE; + private _workspaceContext?: typeof UMB_ENTITY_WORKSPACE_CONTEXT.TYPE; @state() - private _unique?: string; + private _unique?: UmbWorkspaceUniqueType; @state() private _entityType?: string; @@ -23,7 +23,7 @@ export class UmbWorkspaceEntityActionMenuElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (context) => { + this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (context) => { this._workspaceContext = context; this._observeInfo(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts index d9ad8d4856..e58e1c801a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts @@ -1,4 +1,4 @@ -import { UMB_WORKSPACE_CONTEXT } from './tokens/workspace-context.token.js'; +import { UMB_WORKSPACE_CONTEXT } from './tokens/workspace.context-token.js'; import type { UmbWorkspaceContextInterface } from './tokens/workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts index 5ed3921a05..65717af866 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts @@ -1,5 +1,5 @@ import { UmbWorkspaceRouteManager } from '../controllers/workspace-route-manager.controller.js'; -import { UMB_WORKSPACE_CONTEXT } from './tokens/workspace-context.token.js'; +import { UMB_WORKSPACE_CONTEXT } from './tokens/workspace.context-token.js'; import type { UmbSaveableWorkspaceContextInterface } from './tokens/saveable-workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace-context.interface.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace-context.interface.ts index e4fae5bda9..8c3ae27e69 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace-context.interface.ts @@ -1,9 +1,9 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbEntityWorkspaceContextInterface } from './entity-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbContentTypeModel, UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; export interface UmbCollectionWorkspaceContextInterface - extends UmbWorkspaceContextInterface { + extends UmbEntityWorkspaceContextInterface { contentTypeHasCollection: Observable; getCollectionAlias(): string; structure: UmbContentTypeStructureManager; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-collection-context.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts index dcac508623..d3afaa6e58 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts @@ -1,8 +1,8 @@ import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbWorkspaceUniqueType } from './../../types.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; export interface UmbEntityWorkspaceContextInterface extends UmbWorkspaceContextInterface { - readonly unique: Observable; - getEntityType(): string; - getUnique(): string | undefined; + unique: Observable; + getUnique(): UmbWorkspaceUniqueType | undefined; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace.context-token.ts new file mode 100644 index 0000000000..2479d395fb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace.context-token.ts @@ -0,0 +1,12 @@ +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbEntityWorkspaceContextInterface } from './entity-workspace-context.interface.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_ENTITY_WORKSPACE_CONTEXT = new UmbContextToken< + UmbWorkspaceContextInterface, + UmbEntityWorkspaceContextInterface +>( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbEntityWorkspaceContextInterface => (context as any).getUnique !== undefined, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/index.ts index 3d349ba1c3..d68f5d9945 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/index.ts @@ -1,13 +1,16 @@ +export * from './collection-workspace.context-token.js'; +export * from './entity-workspace.context-token.js'; export * from './publishable-workspace.context-token.js'; +export * from './routable-workspace.context-token.js'; export * from './saveable-workspace.context-token.js'; -export * from './variant-workspace-context.token.js'; -export * from './workspace-collection-context.token.js'; -export * from './workspace-context.token.js'; +export * from './variant-workspace.context-token.js'; +export * from './workspace.context-token.js'; +export type * from './collection-workspace-context.interface.js'; +export type * from './entity-workspace-context.interface.js'; +export type * from './invariant-dataset-workspace-context.interface.js'; export type * from './property-structure-workspace-context.interface.js'; export type * from './publishable-workspace-context.interface.js'; export type * from './routable-workspace-context.interface.js'; export type * from './saveable-workspace-context.interface.js'; -export type * from './workspace-collection-context.interface.js'; -export type * from './workspace-context.interface.js'; -export type * from './invariant-dataset-workspace-context.interface.js'; export type * from './variant-dataset-workspace-context.interface.js'; +export type * from './workspace-context.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace.context-token.ts new file mode 100644 index 0000000000..b2ba3a9e13 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace.context-token.ts @@ -0,0 +1,12 @@ +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbPropertyStructureWorkspaceContextInterface } from './property-structure-workspace-context.interface.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_PROPERTY_STRUCTURE_WORKSPACE_CONTEXT = new UmbContextToken< + UmbWorkspaceContextInterface, + UmbPropertyStructureWorkspaceContextInterface +>( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbPropertyStructureWorkspaceContextInterface => 'propertyStructureById' in context, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts index be1cd00336..469fc0c09c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts @@ -1,14 +1,14 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbPublishableWorkspaceContextInterface, - UmbSaveableWorkspaceContextInterface, + UmbWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; export const UMB_PUBLISHABLE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbWorkspaceContextInterface, UmbPublishableWorkspaceContextInterface >( 'UmbWorkspaceContext', undefined, - (context): context is UmbPublishableWorkspaceContextInterface => (context as any).publish !== undefined, + (context): context is UmbPublishableWorkspaceContextInterface => 'publish' in context, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace.context-token.ts new file mode 100644 index 0000000000..9520cd4192 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace.context-token.ts @@ -0,0 +1,8 @@ +import type { UmbRoutableWorkspaceContext } from './routable-workspace-context.interface.js'; +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_ROUTABLE_WORKSPACE_CONTEXT = new UmbContextToken< + UmbWorkspaceContextInterface, + UmbRoutableWorkspaceContext +>('UmbWorkspaceContext', undefined, (context): context is UmbRoutableWorkspaceContext => 'routes' in context); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts index 3daf803e7b..ab78a983f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts @@ -1,5 +1,8 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbWorkspaceContextInterface, UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { + UmbWorkspaceContextInterface, + UmbSaveableWorkspaceContextInterface, +} from '@umbraco-cms/backoffice/workspace'; export const UMB_SAVEABLE_WORKSPACE_CONTEXT = new UmbContextToken< UmbWorkspaceContextInterface, @@ -7,6 +10,5 @@ export const UMB_SAVEABLE_WORKSPACE_CONTEXT = new UmbContextToken< >( 'UmbWorkspaceContext', undefined, - (context): context is UmbSaveableWorkspaceContextInterface => - (context as UmbSaveableWorkspaceContextInterface).getIsNew !== undefined, + (context): context is UmbSaveableWorkspaceContextInterface => 'getIsNew' in context, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-workspace.context-token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-workspace-context.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-workspace.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts index 272e945062..1bfffe1c90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts @@ -3,5 +3,4 @@ import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export interface UmbWorkspaceContextInterface extends UmbApi { readonly workspaceAlias: string; getEntityType(): string; - getUnique(): string | undefined; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace.context-token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace.context-token.ts 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 e31957d8fb..1babbbae1f 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 @@ -1,6 +1,7 @@ export * from './components/index.js'; export * from './contexts/index.js'; export * from './controllers/index.js'; -export type * from './conditions/index.js'; export * from './modals/index.js'; export * from './workspace-property-dataset/index.js'; +export type * from './conditions/index.js'; +export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts index 0a825a1dbe..15240a989c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts @@ -16,9 +16,8 @@ export class UmbEditableWorkspaceElement extends UmbLitElement { new UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'workspaceContext', [api]); } - // TODO: Should it be save, or should it be submit()? [NL] render() { - return html` + return html`
    diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/types.ts new file mode 100644 index 0000000000..738a9fdb2d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/types.ts @@ -0,0 +1 @@ +export type UmbWorkspaceUniqueType = string | null; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/settings/document-type-workspace-view-settings.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/settings/document-type-workspace-view-settings.element.ts index 5e5e55f6be..58aef22912 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/settings/document-type-workspace-view-settings.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/settings/document-type-workspace-view-settings.element.ts @@ -1,14 +1,13 @@ -import type { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context.js'; +import { UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT } from '../../document-type-workspace.context-token.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UUIToggleElement } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-document-type-workspace-view-settings') export class UmbDocumentTypeWorkspaceViewSettingsElement extends UmbLitElement implements UmbWorkspaceViewElement { - #workspaceContext?: UmbDocumentTypeWorkspaceContext; + #workspaceContext?: typeof UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT.TYPE; @state() private _variesByCulture?: boolean; @@ -21,8 +20,8 @@ export class UmbDocumentTypeWorkspaceViewSettingsElement extends UmbLitElement i super(); // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken - this.consumeContext(UMB_WORKSPACE_CONTEXT, (documentTypeContext) => { - this.#workspaceContext = documentTypeContext as UmbDocumentTypeWorkspaceContext; + this.consumeContext(UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT, (documentTypeContext) => { + this.#workspaceContext = documentTypeContext; this._observeDocumentType(); }); } @@ -47,7 +46,7 @@ export class UmbDocumentTypeWorkspaceViewSettingsElement extends UmbLitElement i
    Allow editors to create content of different languages.
    { this.#workspaceContext?.setVariesByCulture((e.target as UUIToggleElement).checked); }} @@ -58,7 +57,7 @@ export class UmbDocumentTypeWorkspaceViewSettingsElement extends UmbLitElement i
    Allow editors to segment their content.
    { this.#workspaceContext?.setVariesBySegment((e.target as UUIToggleElement).checked); }} @@ -71,7 +70,7 @@ export class UmbDocumentTypeWorkspaceViewSettingsElement extends UmbLitElement i
    { this.#workspaceContext?.setIsElement((e.target as UUIToggleElement).checked); }} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts index 62a4719935..71a89c2ed2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts @@ -1,9 +1,9 @@ import type { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context.js'; import type { UmbInputDocumentTypeElement } from '../../../components/input-document-type/input-document-type.element.js'; +import { UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT } from '../../document-type-workspace.context-token.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import type { UmbContentTypeSortModel } from '@umbraco-cms/backoffice/content-type'; import type { UmbInputCollectionConfigurationElement } from '@umbraco-cms/backoffice/components'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @@ -26,7 +26,7 @@ export class UmbDocumentTypeWorkspaceViewStructureElement extends UmbLitElement super(); // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken - this.consumeContext(UMB_WORKSPACE_CONTEXT, (documentTypeContext) => { + this.consumeContext(UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT, (documentTypeContext) => { this.#workspaceContext = documentTypeContext as UmbDocumentTypeWorkspaceContext; this._observeDocumentType(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts index e66d2cb0a4..081ba0069d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts @@ -1,9 +1,9 @@ import type { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context.js'; +import { UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT } from '../../document-type-workspace.context-token.js'; import type { UmbInputTemplateElement } from '@umbraco-cms/backoffice/template'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; import '@umbraco-cms/backoffice/template'; // TODO: This is needed to register the element, but it should be done in a better way without importing the whole module. @@ -20,7 +20,7 @@ export class UmbDocumentTypeWorkspaceViewTemplatesElement extends UmbLitElement constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (documentTypeContext) => { + this.consumeContext(UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT, (documentTypeContext) => { this.#workspaceContext = documentTypeContext as UmbDocumentTypeWorkspaceContext; this._observeDocumentType(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts index 031aed1397..851b75d8cb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts @@ -2,7 +2,6 @@ import { TimeOptions } from './utils.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UMB_MODAL_MANAGER_CONTEXT, UMB_WORKSPACE_MODAL, @@ -10,7 +9,11 @@ import { } from '@umbraco-cms/backoffice/modal'; import './document-workspace-view-info-history.element.js'; import './document-workspace-view-info-reference.element.js'; -import type { UmbDocumentVariantModel, UmbDocumentWorkspaceContext } from '@umbraco-cms/backoffice/document'; +import { + UMB_DOCUMENT_WORKSPACE_CONTEXT, + type UmbDocumentVariantModel, + type UmbDocumentWorkspaceContext, +} from '@umbraco-cms/backoffice/document'; import { DocumentVariantStateModel, type DocumentUrlInfoModel } from '@umbraco-cms/backoffice/external/backend-api'; import { type UmbDocumentTypeDetailModel, @@ -78,8 +81,8 @@ export class UmbDocumentWorkspaceViewInfoElement extends UmbLitElement { this._editDocumentTypePath = routeBuilder({}); }); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (nodeContext) => { - this.#workspaceContext = nodeContext as UmbDocumentWorkspaceContext; + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context; this._documentTypeUnique = this.#workspaceContext.getContentTypeId()!; this.#getData(); this._observeContent(); @@ -258,7 +261,7 @@ export class UmbDocumentWorkspaceViewInfoElement extends UmbLitElement { - ` + ` : html``} diff --git a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/logviewer-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/logviewer-workspace.context.ts index d37ee3f8b1..9862431d36 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/logviewer-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/logviewer-workspace.context.ts @@ -39,10 +39,6 @@ export class UmbLogViewerWorkspaceContext extends UmbControllerBase implements U return 'Log Viewer'; } - getUnique() { - return undefined; - } - get today() { const today = new Date(); const dd = String(today.getDate()).padStart(2, '0'); @@ -109,7 +105,6 @@ export class UmbLogViewerWorkspaceContext extends UmbControllerBase implements U constructor(host: UmbControllerHost) { super(host); - console.log('log-viewer context'); this.provideContext(UMB_WORKSPACE_CONTEXT, this); // TODO: Revisit usage of workspace for this case... currently no other workspace context provides them self with their own token. this.provideContext(UMB_APP_LOG_VIEWER_CONTEXT, this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts index 93abbbb22b..e276337937 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts @@ -1,10 +1,10 @@ import type { UmbMediaTypeWorkspaceContext } from './media-type-workspace.context.js'; +import { UMB_MEDIA_TYPE_WORKSPACE_CONTEXT } from './media-type-workspace.context-token.js'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UMB_ICON_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { generateAlias } from '@umbraco-cms/backoffice/utils'; @customElement('umb-media-type-workspace-editor') @@ -26,8 +26,8 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbMediaTypeWorkspaceContext; + this.consumeContext(UMB_MEDIA_TYPE_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context; this.#observeMediaType(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/views/structure/media-type-workspace-view-structure.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/views/structure/media-type-workspace-view-structure.element.ts index 02db30bb48..04a8e22e52 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/views/structure/media-type-workspace-view-structure.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/views/structure/media-type-workspace-view-structure.element.ts @@ -1,9 +1,9 @@ import type { UmbMediaTypeWorkspaceContext } from '../../media-type-workspace.context.js'; import type { UmbInputMediaTypeElement } from '../../../components/input-media-type/input-media-type.element.js'; +import { UMB_MEDIA_TYPE_WORKSPACE_CONTEXT } from '../../media-type-workspace.context-token.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import type { UmbContentTypeSortModel } from '@umbraco-cms/backoffice/content-type'; import type { UmbInputCollectionConfigurationElement } from '@umbraco-cms/backoffice/components'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @@ -26,8 +26,8 @@ export class UmbMediaTypeWorkspaceViewStructureElement extends UmbLitElement imp super(); // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken - this.consumeContext(UMB_WORKSPACE_CONTEXT, (mediaTypeContext) => { - this.#workspaceContext = mediaTypeContext as UmbMediaTypeWorkspaceContext; + this.consumeContext(UMB_MEDIA_TYPE_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context; this._observeMediaType(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info.element.ts index 7f2c56d9bd..d6c8eaf1da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info.element.ts @@ -1,12 +1,11 @@ import { TimeOptions } from './utils.js'; import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import './media-workspace-view-info-history.element.js'; import './media-workspace-view-info-reference.element.js'; -import type { UmbMediaWorkspaceContext } from '@umbraco-cms/backoffice/media'; +import { UMB_MEDIA_WORKSPACE_CONTEXT, type UmbMediaWorkspaceContext } from '@umbraco-cms/backoffice/media'; import type { MediaUrlInfoModel } from '@umbraco-cms/backoffice/external/backend-api'; @customElement('umb-media-workspace-view-info') @@ -20,7 +19,7 @@ export class UmbMediaWorkspaceViewInfoElement extends UmbLitElement { @state() private _mediaUnique = ''; - private _workspaceContext?: typeof UMB_WORKSPACE_CONTEXT.TYPE; + private _workspaceContext?: typeof UMB_MEDIA_WORKSPACE_CONTEXT.TYPE; @state() private _editMediaTypePath = ''; @@ -43,8 +42,8 @@ export class UmbMediaWorkspaceViewInfoElement extends UmbLitElement { this._editMediaTypePath = routeBuilder({}); }); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (nodeContext) => { - this._workspaceContext = nodeContext; + this.consumeContext(UMB_MEDIA_WORKSPACE_CONTEXT, (context) => { + this._workspaceContext = context; this._observeContent(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/views/info/member-type-workspace-view-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/views/info/member-type-workspace-view-info.element.ts index fe7267c904..d38e509e02 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/views/info/member-type-workspace-view-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/views/info/member-type-workspace-view-info.element.ts @@ -1,14 +1,13 @@ // import { UMB_COMPOSITION_PICKER_MODAL, type UmbCompositionPickerModalData } from '../../../modals/index.js'; -import type { UmbMemberGroupWorkspaceContext } from '../../member-group-workspace.context.js'; +import { UMB_MEMBER_GROUP_WORKSPACE_CONTEXT } from '../../member-group-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-member-type-workspace-view-member-info') export class UmbMemberTypeWorkspaceViewMemberInfoElement extends UmbLitElement implements UmbWorkspaceViewElement { - private _workspaceContext?: UmbMemberGroupWorkspaceContext; + private _workspaceContext?: typeof UMB_MEMBER_GROUP_WORKSPACE_CONTEXT.TYPE; @state() private _unique = ''; @@ -16,8 +15,8 @@ export class UmbMemberTypeWorkspaceViewMemberInfoElement extends UmbLitElement i constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, async (context) => { - this._workspaceContext = context as UmbMemberGroupWorkspaceContext; + this.consumeContext(UMB_MEMBER_GROUP_WORKSPACE_CONTEXT, async (context) => { + this._workspaceContext = context; this._unique = this._workspaceContext.getUnique() ?? ''; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts index 7a51542a8f..56bdd3bc42 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts @@ -13,7 +13,6 @@ import { import type { UmbRoutableWorkspaceContext, UmbVariantDatasetWorkspaceContextInterface, - UmbWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { @@ -31,10 +30,7 @@ import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; type EntityType = UmbMemberDetailModel; export class UmbMemberWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements - UmbVariantDatasetWorkspaceContextInterface, - UmbRoutableWorkspaceContext, - UmbWorkspaceContextInterface + implements UmbVariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext { public readonly repository = new UmbMemberDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/member/member-workspace-view-member-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/member/member-workspace-view-member-info.element.ts index bd1c6d3fde..48025bc6a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/member/member-workspace-view-member-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/member/member-workspace-view-member-info.element.ts @@ -1,10 +1,9 @@ // import { UMB_COMPOSITION_PICKER_MODAL, type UmbCompositionPickerModalData } from '../../../modals/index.js'; -import type { UmbMemberWorkspaceContext } from '../../member-workspace.context.js'; +import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import { UmbMemberTypeItemRepository } from '@umbraco-cms/backoffice/member-type'; @@ -17,7 +16,7 @@ export class UmbMemberWorkspaceViewMemberInfoElement extends UmbLitElement imple @state() private _memberTypeIcon = ''; - private _workspaceContext?: UmbMemberWorkspaceContext; + private _workspaceContext?: typeof UMB_MEMBER_WORKSPACE_CONTEXT.TYPE; private _memberTypeItemRepository: UmbMemberTypeItemRepository = new UmbMemberTypeItemRepository(this); @state() @@ -40,8 +39,8 @@ export class UmbMemberWorkspaceViewMemberInfoElement extends UmbLitElement imple this._editMemberTypePath = routeBuilder({}); }); - this.consumeContext(UMB_WORKSPACE_CONTEXT, async (nodeContext) => { - this._workspaceContext = nodeContext as UmbMemberWorkspaceContext; + this.consumeContext(UMB_MEMBER_WORKSPACE_CONTEXT, async (context) => { + this._workspaceContext = context; this.observe(this._workspaceContext.contentTypeUnique, (unique) => (this._memberTypeUnique = unique || '')); this.observe(this._workspaceContext.createDate, (date) => (this._createDate = date || 'Unknown')); this.observe(this._workspaceContext.updateDate, (date) => (this._updateDate = date || 'Unknown')); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts index a545c0ae31..bc053ba3af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts @@ -1,4 +1,5 @@ export * from './repository/index.js'; +export * from './workspace/script-workspace.context-token.js'; export * from './tree/index.js'; export * from './types.js'; export * from './entity.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace-editor.element.ts index 9142f47d06..5a0c17ec3d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace-editor.element.ts @@ -1,9 +1,8 @@ -import type { UmbScriptWorkspaceContext } from './script-workspace.context.js'; +import { UMB_SCRIPT_WORKSPACE_CONTEXT } from './script-workspace.context-token.js'; import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-script-workspace-editor') @@ -23,31 +22,31 @@ export class UmbScriptWorkspaceEditorElement extends UmbLitElement { @state() private _isNew?: boolean = false; - #scriptsWorkspaceContext?: UmbScriptWorkspaceContext; + #context?: typeof UMB_SCRIPT_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this.#scriptsWorkspaceContext = workspaceContext as UmbScriptWorkspaceContext; + this.consumeContext(UMB_SCRIPT_WORKSPACE_CONTEXT, (context) => { + this.#context = context; - this.observe(this.#scriptsWorkspaceContext.name, (name) => { + this.observe(this.#context.name, (name) => { this._name = name; }); - this.observe(this.#scriptsWorkspaceContext.content, (content) => { + this.observe(this.#context.content, (content) => { this._content = content; }); - this.observe(this.#scriptsWorkspaceContext.path, (path) => { + this.observe(this.#context.path, (path) => { this._path = path; }); - this.observe(this.#scriptsWorkspaceContext.isCodeEditorReady, (isReady) => { + this.observe(this.#context.isCodeEditorReady, (isReady) => { this._ready = isReady; }); - this.observe(this.#scriptsWorkspaceContext.isNew, (isNew) => { + this.observe(this.#context.isNew, (isNew) => { this._isNew = isNew; }); }); @@ -56,13 +55,13 @@ export class UmbScriptWorkspaceEditorElement extends UmbLitElement { #onNameInput(event: Event) { const target = event.target as UUIInputElement; const value = target.value as string; - this.#scriptsWorkspaceContext?.setName(value); + this.#context?.setName(value); } #onCodeEditorInput(event: Event) { const target = event.target as UmbCodeEditorElement; const value = target.code as string; - this.#scriptsWorkspaceContext?.setContent(value); + this.#context?.setContent(value); } #renderCodeEditor() { @@ -91,7 +90,7 @@ export class UmbScriptWorkspaceEditorElement extends UmbLitElement { ? this.#renderCodeEditor() : html`
    -
    `} +
    `} `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context-token.ts new file mode 100644 index 0000000000..84fcd4c0d6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context-token.ts @@ -0,0 +1,12 @@ +import type { UmbScriptWorkspaceContext } from './script-workspace.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; + +export const UMB_SCRIPT_WORKSPACE_CONTEXT = new UmbContextToken< + UmbWorkspaceContextInterface, + UmbScriptWorkspaceContext +>( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbScriptWorkspaceContext => context.getEntityType?.() === 'script', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts index ad7e644241..31e8a93c1e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts @@ -1,7 +1,6 @@ -import type { UmbStylesheetWorkspaceContext } from './stylesheet-workspace.context.js'; +import { UMB_STYLESHEET_WORKSPACE_CONTEXT } from './stylesheet-workspace.context-token.js'; import type { UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -16,13 +15,13 @@ export class UmbStylesheetWorkspaceEditorElement extends UmbLitElement { @state() private _name?: string; - #workspaceContext?: UmbStylesheetWorkspaceContext; + #workspaceContext?: typeof UMB_STYLESHEET_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbStylesheetWorkspaceContext; + this.consumeContext(UMB_STYLESHEET_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context; this.observe(this.#workspaceContext.path, (path) => (this._path = path), '_observeStylesheetPath'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/views/rich-text-rule/stylesheet-rich-text-rule-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/views/rich-text-rule/stylesheet-rich-text-rule-workspace-view.element.ts index f55d91bf51..047069c5db 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/views/rich-text-rule/stylesheet-rich-text-rule-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/views/rich-text-rule/stylesheet-rich-text-rule-workspace-view.element.ts @@ -1,10 +1,9 @@ -import type { UmbStylesheetWorkspaceContext } from '../../stylesheet-workspace.context.js'; import type { UmbStylesheetRule } from '../../../types.js'; import type { UmbStylesheetRuleInputElement } from '../../../components/index.js'; import { UmbStylesheetRuleManager } from '../../../utils/index.js'; +import { UMB_STYLESHEET_WORKSPACE_CONTEXT } from '../../stylesheet-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; @@ -13,15 +12,15 @@ export class UmbStylesheetRichTextRuleWorkspaceViewElement extends UmbLitElement @state() _rules: UmbStylesheetRule[] = []; - #context?: UmbStylesheetWorkspaceContext; + #context?: typeof UMB_STYLESHEET_WORKSPACE_CONTEXT.TYPE; #stylesheetRuleManager = new UmbStylesheetRuleManager(); #stylesheetContent = ''; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this.#context = workspaceContext as UmbStylesheetWorkspaceContext; + this.consumeContext(UMB_STYLESHEET_WORKSPACE_CONTEXT, (context) => { + this.#context = context; this.#observeContent(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts index 7445d002ae..d3a169032e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts @@ -1,11 +1,11 @@ import type { UmbUserDetailModel } from '../index.js'; import { UMB_USER_ENTITY_TYPE } from '../entity.js'; import type { UmbUserWorkspaceContext } from './user-workspace.context.js'; +import { UMB_USER_WORKSPACE_CONTEXT } from './user-workspace.context-token.js'; import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; // import local components. Theses are not meant to be used outside of this component. @@ -24,8 +24,8 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this.#workspaceContext = workspaceContext as UmbUserWorkspaceContext; + this.consumeContext(UMB_USER_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context; this.#observeUser(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts index a98faea18c..271ae6230e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts @@ -12,10 +12,6 @@ export class UmbWebhookWorkspaceContext extends UmbControllerBase implements Umb return UMB_WEBHOOK_ENTITY_TYPE; } - getUnique() { - return undefined; - } - constructor(host: UmbControllerHost) { super(host); this.provideContext(UMB_WORKSPACE_CONTEXT, this); From 83c3b6ad10854f32981e6d93b275acf8d1609d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 11:14:27 +0100 Subject: [PATCH 16/29] further token corrections --- .../core/validation/context/validation.context-token.ts | 3 ++- .../packages/core/validation/context/validation.context.ts | 1 + .../conditions/workspace-has-collection.condition.ts | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context-token.ts index 7ddf4a218b..3223a775dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context-token.ts @@ -1,3 +1,4 @@ +import type { UmbValidationContext } from './validation.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export const UMB_VALIDATION_CONTEXT = new UmbContextToken('UmbValidationContext'); +export const UMB_VALIDATION_CONTEXT = new UmbContextToken('UmbValidationContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context.ts index 0e8fd21e78..e5d1eaeaca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/validation.context.ts @@ -1,3 +1,4 @@ +import { UMB_VALIDATION_CONTEXT } from './validation.context-token.js'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts index d1dd0f8df1..ca8962bc53 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts @@ -1,4 +1,4 @@ -import { UMB_WORKSPACE_COLLECTION_CONTEXT } from '../contexts/tokens/workspace-collection-context.token.js'; +import { UMB_COLLECTION_WORKSPACE_CONTEXT } from '../contexts/tokens/collection-workspace-context.token.js'; import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; import type { ManifestCondition, @@ -15,7 +15,7 @@ export class UmbWorkspaceHasCollectionCondition constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) { super(host, args); - this.consumeContext(UMB_WORKSPACE_COLLECTION_CONTEXT, (context) => { + this.consumeContext(UMB_COLLECTION_WORKSPACE_CONTEXT, (context) => { this.observe( context.contentTypeHasCollection, (hasCollection) => { From 96ba4d7f902ee8742c4ea70504576ce9436a757c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 11:16:56 +0100 Subject: [PATCH 17/29] deprecation of UMB_WORKSPACE_COLLECTION_CONTEXT --- .../property-editor-ui-collection-view.element.ts | 4 ++-- .../conditions/workspace-has-collection.condition.ts | 2 +- .../contexts/tokens/collection-workspace.context-token.ts | 8 +++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/collection-view/property-editor-ui-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/collection-view/property-editor-ui-collection-view.element.ts index 62a1a1d7e1..3d7838c4ef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/collection-view/property-editor-ui-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/collection-view/property-editor-ui-collection-view.element.ts @@ -3,7 +3,7 @@ import { html, customElement, property, state } from '@umbraco-cms/backoffice/ex import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UMB_DOCUMENT_COLLECTION_ALIAS } from '@umbraco-cms/backoffice/document'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; -import { UMB_WORKSPACE_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UMB_COLLECTION_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbCollectionBulkActionPermissions, @@ -31,7 +31,7 @@ export class UmbPropertyEditorUICollectionViewElement extends UmbLitElement impl constructor() { super(); - this.consumeContext(UMB_WORKSPACE_COLLECTION_CONTEXT, (workspaceContext) => { + this.consumeContext(UMB_COLLECTION_WORKSPACE_CONTEXT, (workspaceContext) => { this._collectionAlias = workspaceContext.getCollectionAlias(); this.consumeContext(UMB_PROPERTY_CONTEXT, (propertyContext) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts index ca8962bc53..ef1ef8c203 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-has-collection.condition.ts @@ -1,4 +1,4 @@ -import { UMB_COLLECTION_WORKSPACE_CONTEXT } from '../contexts/tokens/collection-workspace-context.token.js'; +import { UMB_COLLECTION_WORKSPACE_CONTEXT } from '../contexts/tokens/collection-workspace.context-token.js'; import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; import type { ManifestCondition, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts index b52145e403..d0685cde5e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts @@ -5,7 +5,7 @@ import type { UmbCollectionWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; -export const UMB_WORKSPACE_COLLECTION_CONTEXT = new UmbContextToken< +export const UMB_COLLECTION_WORKSPACE_CONTEXT = new UmbContextToken< UmbWorkspaceContextInterface, UmbCollectionWorkspaceContextInterface >( @@ -14,3 +14,9 @@ export const UMB_WORKSPACE_COLLECTION_CONTEXT = new UmbContextToken< (context): context is UmbCollectionWorkspaceContextInterface => (context as UmbCollectionWorkspaceContextInterface).contentTypeHasCollection !== undefined, ); + +/** + * @deprecated Use `UMB_COLLECTION_WORKSPACE_CONTEXT` instead. This token will be removed in the RC version. + * TODO: Remove in RC + */ +export const UMB_WORKSPACE_COLLECTION_CONTEXT = UMB_COLLECTION_WORKSPACE_CONTEXT; From e016194a610fc253d121d95961a3961d4823589a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 11:25:06 +0100 Subject: [PATCH 18/29] remove interface from interface names --- .../block-grid-area-type-workspace.context.ts | 9 +++------ .../block-type-workspace.context-token.ts | 7 ++----- .../workspace/block-type-workspace.context.ts | 4 ++-- .../workspace/block-workspace.context-token.ts | 4 ++-- .../property-type-settings-modal.context.ts | 6 +++--- .../content-type-workspace-context.interface.ts | 4 ++-- .../extension-registry/models/workspace.model.ts | 4 ++-- .../workspace-action/common/save/save.action.ts | 6 +++--- .../conditions/workspace-alias.condition.ts | 9 ++++----- .../contexts/default-workspace.context.ts | 4 ++-- .../contexts/saveable-workspace-context-base.ts | 4 ++-- .../collection-workspace-context.interface.ts | 7 +++---- .../tokens/collection-workspace.context-token.ts | 13 +++++-------- .../tokens/entity-workspace-context.interface.ts | 4 ++-- .../tokens/entity-workspace.context-token.ts | 11 ++++------- ...variant-dataset-workspace-context.interface.ts | 6 +++--- ...perty-structure-workspace-context.interface.ts | 4 ++-- .../property-structure-workspace.context-token.ts | 10 +++++----- .../publishable-workspace-context.interface.ts | 4 ++-- .../tokens/publishable-workspace.context-token.ts | 15 ++++----------- .../routable-workspace-context.interface.ts | 4 ++-- .../tokens/routable-workspace.context-token.ts | 11 ++++++----- .../saveable-workspace-context.interface.ts | 11 +++++++---- .../tokens/saveable-workspace.context-token.ts | 12 +++--------- ...variant-dataset-workspace-context.interface.ts | 8 ++++---- .../tokens/variant-workspace.context-token.ts | 14 +++++--------- .../tokens/workspace-context.interface.ts | 9 ++++++++- .../contexts/tokens/workspace.context-token.ts | 4 ++-- .../kinds/editable/editable-workspace.element.ts | 4 ++-- ...nvariant-workspace-property-dataset-context.ts | 4 ++-- .../data-type-workspace.context-token.ts | 7 ++----- .../workspace/data-type-workspace.context.ts | 4 ++-- .../dictionary-workspace.context-token.ts | 4 ++-- .../workspace/dictionary-workspace.context.ts | 4 ++-- .../document-type-workspace.context-token.ts | 4 ++-- .../workspace/document-workspace.context-token.ts | 4 ++-- .../workspace/document-workspace.context.ts | 12 ++++++------ .../language/language-workspace.context-token.ts | 4 ++-- .../language/language-workspace.context.ts | 4 ++-- .../workspace/logviewer-workspace.context.ts | 4 ++-- .../media-type-workspace.context-token.ts | 4 ++-- .../workspace/media-workspace.context-token.ts | 7 ++----- .../media/workspace/media-workspace.context.ts | 8 +++----- .../member-group-workspace.context-token.ts | 4 ++-- .../workspace/member-group-workspace.context.ts | 4 ++-- .../member-type-workspace.context-token.ts | 4 ++-- .../workspace/member-workspace.context-token.ts | 7 ++----- .../member/workspace/member-workspace.context.ts | 7 ++----- .../relation-type-workspace.context-token.ts | 4 ++-- .../workspace/relation-type-workspace.context.ts | 4 ++-- .../templating/code-editor/code-editor.stories.ts | 2 +- .../partial-view-workspace.context-token.ts | 4 ++-- .../workspace/partial-view-workspace.context.ts | 7 ++----- .../workspace/script-workspace.context-token.ts | 7 ++----- .../scripts/workspace/script-workspace.context.ts | 4 ++-- .../stylesheet-workspace.context-token.ts | 4 ++-- .../workspace/stylesheet-workspace.context.ts | 4 ++-- .../workspace/template-workspace.context-token.ts | 4 ++-- .../workspace/template-workspace.context.ts | 7 ++----- .../user-group-workspace.context-token.ts | 4 ++-- .../workspace/user-group-workspace.context.ts | 7 ++----- .../workspace/user-workspace.context-token.ts | 7 ++----- .../user/user/workspace/user-workspace.context.ts | 4 ++-- .../webhook/webhook-workspace.context.ts | 4 ++-- 64 files changed, 170 insertions(+), 219 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts index 4a2a9e03d7..7354fc4d2a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts @@ -1,10 +1,7 @@ import type { UmbBlockGridTypeAreaType } from '../../../types.js'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; -import type { - UmbInvariantDatasetWorkspaceContextInterface, - UmbWorkspaceContextInterface, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbInvariantDatasetWorkspaceContext, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbSaveableWorkspaceContextBase, UmbInvariantWorkspacePropertyDatasetContext, @@ -16,7 +13,7 @@ import type { ManifestWorkspace, PropertyEditorSettingsProperty } from '@umbraco export class UmbBlockGridAreaTypeWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbInvariantDatasetWorkspaceContextInterface + implements UmbInvariantDatasetWorkspaceContext { // Just for context token safety: public readonly IS_BLOCK_GRID_AREA_TYPE_WORKSPACE_CONTEXT = true; @@ -132,7 +129,7 @@ export class UmbBlockGridAreaTypeWorkspaceContext export default UmbBlockGridAreaTypeWorkspaceContext; export const UMB_BLOCK_GRID_AREA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, + UmbWorkspaceContext, UmbBlockGridAreaTypeWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context-token.ts index 6817e2d795..01b8191323 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context-token.ts @@ -1,11 +1,8 @@ import type { UmbBlockTypeWorkspaceContext } from './block-type-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -export const UMB_BLOCK_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbBlockTypeWorkspaceContext ->( +export const UMB_BLOCK_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, (context): context is UmbBlockTypeWorkspaceContext => (context as any).IS_BLOCK_TYPE_WORKSPACE_CONTEXT, diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts index bebf574d53..5c74f82147 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts @@ -3,7 +3,7 @@ import { UmbBlockTypeWorkspaceEditorElement } from './block-type-workspace-edito import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { - UmbInvariantDatasetWorkspaceContextInterface, + UmbInvariantDatasetWorkspaceContext, UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; import { @@ -18,7 +18,7 @@ import type { ManifestWorkspace, PropertyEditorSettingsProperty } from '@umbraco export class UmbBlockTypeWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbInvariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbInvariantDatasetWorkspaceContext, UmbRoutableWorkspaceContext { // Just for context token safety: public readonly IS_BLOCK_TYPE_WORKSPACE_CONTEXT = true; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context-token.ts index 696d6c70a4..a2147870e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context-token.ts @@ -1,8 +1,8 @@ import type { UmbBlockWorkspaceContext } from './block-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -export const UMB_BLOCK_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_BLOCK_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, (context): context is UmbBlockWorkspaceContext => (context as any).IS_BLOCK_WORKSPACE_CONTEXT, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.context.ts index e22f3f0aa2..76c94f8483 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/property-type-settings/property-type-settings-modal.context.ts @@ -1,4 +1,4 @@ -import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; @@ -10,7 +10,7 @@ export const UMB_PROPERTY_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.PropertyType'; */ export class UmbPropertyTypeWorkspaceContext extends UmbContextBase - implements UmbWorkspaceContextInterface + implements UmbWorkspaceContext { constructor(host: UmbControllerHost) { super(host, UMB_PROPERTY_TYPE_WORKSPACE_CONTEXT); @@ -32,7 +32,7 @@ export class UmbPropertyTypeWorkspaceContext export default UmbPropertyTypeWorkspaceContext; export const UMB_PROPERTY_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, + UmbWorkspaceContext, UmbPropertyTypeWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/content-type-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/content-type-workspace-context.interface.ts index 743abd5e8e..959d8a438b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/content-type-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/content-type-workspace-context.interface.ts @@ -1,10 +1,10 @@ import type { UmbContentTypeCompositionModel, UmbContentTypeModel, UmbContentTypeSortModel } from '../types.js'; import type { UmbContentTypeStructureManager } from '../structure/index.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export interface UmbContentTypeWorkspaceContext - extends UmbSaveableWorkspaceContextInterface { + extends UmbSaveableWorkspaceContext { readonly IS_CONTENT_TYPE_WORKSPACE_CONTEXT: true; readonly name: Observable; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/workspace.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/workspace.model.ts index 7be5f5b1be..d53e829441 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/workspace.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/workspace.model.ts @@ -1,5 +1,5 @@ import type { UmbRoutableWorkspaceContext } from '../../workspace/contexts/tokens/routable-workspace-context.interface.js'; -import type { UmbWorkspaceContextInterface } from '../../workspace/contexts/tokens/workspace-context.interface.js'; +import type { UmbWorkspaceContext } from '../../workspace/contexts/tokens/workspace-context.interface.js'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import type { ManifestElementAndApi } from '@umbraco-cms/backoffice/extension-api'; @@ -7,7 +7,7 @@ import type { ManifestElementAndApi } from '@umbraco-cms/backoffice/extension-ap export interface ManifestWorkspace< MetaType extends MetaWorkspace = MetaWorkspace, ElementType extends UmbControllerHostElement = UmbControllerHostElement, - ApiType extends UmbWorkspaceContextInterface = UmbWorkspaceContextInterface, + ApiType extends UmbWorkspaceContext = UmbWorkspaceContext, > extends ManifestElementAndApi { type: 'workspace'; meta: MetaType; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/save/save.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/save/save.action.ts index 2bd18c3909..c7f4c1f985 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/save/save.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/save/save.action.ts @@ -1,10 +1,10 @@ -import type { UmbSaveableWorkspaceContextInterface } from '../../../../contexts/tokens/saveable-workspace-context.interface.js'; +import type { UmbSaveableWorkspaceContext } from '../../../../contexts/tokens/saveable-workspace-context.interface.js'; import { UmbWorkspaceActionBase } from '../../workspace-action-base.controller.js'; import { UMB_SAVEABLE_WORKSPACE_CONTEXT, type UmbWorkspaceActionArgs } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export class UmbSaveWorkspaceAction extends UmbWorkspaceActionBase { - constructor(host: UmbControllerHost, args: UmbWorkspaceActionArgs) { +export class UmbSaveWorkspaceAction extends UmbWorkspaceActionBase { + constructor(host: UmbControllerHost, args: UmbWorkspaceActionArgs) { super(host, args); // TODO: Could we make change label depending on the state? diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-alias.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-alias.condition.ts index 46b33dc39d..db6308554b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-alias.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/conditions/workspace-alias.condition.ts @@ -1,4 +1,4 @@ -import { UMB_WORKSPACE_CONTEXT, type UmbWorkspaceContextInterface } from '../contexts/index.js'; +import { UMB_WORKSPACE_CONTEXT, type UmbWorkspaceContext } from '../contexts/index.js'; import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; import type { ManifestCondition, @@ -15,12 +15,11 @@ export class UmbWorkspaceAliasCondition constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) { super(host, args); - let permissionCheck: ((context: UmbWorkspaceContextInterface) => boolean) | undefined = undefined; + let permissionCheck: ((context: UmbWorkspaceContext) => boolean) | undefined = undefined; if (this.config.match) { - permissionCheck = (context: UmbWorkspaceContextInterface) => context.workspaceAlias === this.config.match; + permissionCheck = (context: UmbWorkspaceContext) => context.workspaceAlias === this.config.match; } else if (this.config.oneOf) { - permissionCheck = (context: UmbWorkspaceContextInterface) => - this.config.oneOf!.indexOf(context.workspaceAlias) !== -1; + permissionCheck = (context: UmbWorkspaceContext) => this.config.oneOf!.indexOf(context.workspaceAlias) !== -1; } if (permissionCheck !== undefined) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts index e58e1c801a..04c90380b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/default-workspace.context.ts @@ -1,12 +1,12 @@ import { UMB_WORKSPACE_CONTEXT } from './tokens/workspace.context-token.js'; -import type { UmbWorkspaceContextInterface } from './tokens/workspace-context.interface.js'; +import type { UmbWorkspaceContext } from './tokens/workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; export abstract class UmbDefaultWorkspaceContext extends UmbContextBase - implements UmbWorkspaceContextInterface + implements UmbWorkspaceContext { public workspaceAlias!: string; #entityType!: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts index 65717af866..c734354b8c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/saveable-workspace-context-base.ts @@ -1,6 +1,6 @@ import { UmbWorkspaceRouteManager } from '../controllers/workspace-route-manager.controller.js'; import { UMB_WORKSPACE_CONTEXT } from './tokens/workspace.context-token.js'; -import type { UmbSaveableWorkspaceContextInterface } from './tokens/saveable-workspace-context.interface.js'; +import type { UmbSaveableWorkspaceContext } from './tokens/saveable-workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; @@ -10,7 +10,7 @@ import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; export abstract class UmbSaveableWorkspaceContextBase extends UmbContextBase> - implements UmbSaveableWorkspaceContextInterface + implements UmbSaveableWorkspaceContext { public readonly workspaceAlias: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace-context.interface.ts index 8c3ae27e69..d4d4e54a63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace-context.interface.ts @@ -1,9 +1,8 @@ -import type { UmbEntityWorkspaceContextInterface } from './entity-workspace-context.interface.js'; +import type { UmbEntityWorkspaceContext } from './entity-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbContentTypeModel, UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; -export interface UmbCollectionWorkspaceContextInterface - extends UmbEntityWorkspaceContextInterface { +export interface UmbCollectionWorkspaceContext extends UmbEntityWorkspaceContext { contentTypeHasCollection: Observable; getCollectionAlias(): string; structure: UmbContentTypeStructureManager; @@ -14,4 +13,4 @@ export interface UmbCollectionWorkspaceContextInterface - extends UmbCollectionWorkspaceContextInterface {} + extends UmbCollectionWorkspaceContext {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts index d0685cde5e..c39ef48779 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/collection-workspace.context-token.ts @@ -1,18 +1,15 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; -import type { - UmbWorkspaceContextInterface, - UmbCollectionWorkspaceContextInterface, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext, UmbCollectionWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_COLLECTION_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbCollectionWorkspaceContextInterface + UmbWorkspaceContext, + UmbCollectionWorkspaceContext >( 'UmbWorkspaceContext', undefined, - (context): context is UmbCollectionWorkspaceContextInterface => - (context as UmbCollectionWorkspaceContextInterface).contentTypeHasCollection !== undefined, + (context): context is UmbCollectionWorkspaceContext => + (context as UmbCollectionWorkspaceContext).contentTypeHasCollection !== undefined, ); /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts index d3afaa6e58..16f335e73e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace-context.interface.ts @@ -1,8 +1,8 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbWorkspaceContext } from './workspace-context.interface.js'; import type { UmbWorkspaceUniqueType } from './../../types.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -export interface UmbEntityWorkspaceContextInterface extends UmbWorkspaceContextInterface { +export interface UmbEntityWorkspaceContext extends UmbWorkspaceContext { unique: Observable; getUnique(): UmbWorkspaceUniqueType | undefined; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace.context-token.ts index 2479d395fb..6305c04de2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/entity-workspace.context-token.ts @@ -1,12 +1,9 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; -import type { UmbEntityWorkspaceContextInterface } from './entity-workspace-context.interface.js'; +import type { UmbWorkspaceContext } from './workspace-context.interface.js'; +import type { UmbEntityWorkspaceContext } from './entity-workspace-context.interface.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export const UMB_ENTITY_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbEntityWorkspaceContextInterface ->( +export const UMB_ENTITY_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, - (context): context is UmbEntityWorkspaceContextInterface => (context as any).getUnique !== undefined, + (context): context is UmbEntityWorkspaceContext => (context as any).getUnique !== undefined, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts index 0105bc08e0..1fdf54d75c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/invariant-dataset-workspace-context.interface.ts @@ -1,10 +1,10 @@ import type { UmbVariantId } from '../../../variant/variant-id.class.js'; import type { UmbPropertyDatasetContext } from '../../../property/property-dataset/property-dataset-context.interface.js'; -import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; +import type { UmbSaveableWorkspaceContext } from './saveable-workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -export interface UmbInvariantDatasetWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { +export interface UmbInvariantDatasetWorkspaceContext extends UmbSaveableWorkspaceContext { // Name: name: Observable; getName(): string | undefined; @@ -22,4 +22,4 @@ export interface UmbInvariantDatasetWorkspaceContextInterface extends UmbSaveabl * @deprecated Use UmbInvariantWorkspaceContextInterface instead — Will be removed before RC. * TODO: Delete before RC. */ -export interface UmbInvariantableWorkspaceContextInterface extends UmbInvariantDatasetWorkspaceContextInterface {} +export interface UmbInvariantableWorkspaceContextInterface extends UmbInvariantDatasetWorkspaceContext {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace-context.interface.ts index 31f0cc5112..da9d3467e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace-context.interface.ts @@ -1,7 +1,7 @@ -import type { UmbEntityWorkspaceContextInterface } from './entity-workspace-context.interface.js'; +import type { UmbEntityWorkspaceContext } from './entity-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { ValueModelBaseModel } from '@umbraco-cms/backoffice/external/backend-api'; -export interface UmbPropertyStructureWorkspaceContextInterface extends UmbEntityWorkspaceContextInterface { +export interface UmbPropertyStructureWorkspaceContext extends UmbEntityWorkspaceContext { propertyStructureById(id: string): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace.context-token.ts index b2ba3a9e13..6b4f95d8c3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/property-structure-workspace.context-token.ts @@ -1,12 +1,12 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; -import type { UmbPropertyStructureWorkspaceContextInterface } from './property-structure-workspace-context.interface.js'; +import type { UmbWorkspaceContext } from './workspace-context.interface.js'; +import type { UmbPropertyStructureWorkspaceContext } from './property-structure-workspace-context.interface.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export const UMB_PROPERTY_STRUCTURE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbPropertyStructureWorkspaceContextInterface + UmbWorkspaceContext, + UmbPropertyStructureWorkspaceContext >( 'UmbWorkspaceContext', undefined, - (context): context is UmbPropertyStructureWorkspaceContextInterface => 'propertyStructureById' in context, + (context): context is UmbPropertyStructureWorkspaceContext => 'propertyStructureById' in context, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts index d3dc964eec..c5cf6ca39c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts @@ -1,6 +1,6 @@ -import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; +import type { UmbSaveableWorkspaceContext } from './saveable-workspace-context.interface.js'; -export interface UmbPublishableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { +export interface UmbPublishableWorkspaceContext extends UmbSaveableWorkspaceContext { saveAndPublish(): Promise; publish(): Promise; unpublish(): Promise; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts index 469fc0c09c..616b772a8f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace.context-token.ts @@ -1,14 +1,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { - UmbPublishableWorkspaceContextInterface, - UmbWorkspaceContextInterface, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbPublishableWorkspaceContext, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_PUBLISHABLE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbPublishableWorkspaceContextInterface ->( - 'UmbWorkspaceContext', - undefined, - (context): context is UmbPublishableWorkspaceContextInterface => 'publish' in context, -); + UmbWorkspaceContext, + UmbPublishableWorkspaceContext +>('UmbWorkspaceContext', undefined, (context): context is UmbPublishableWorkspaceContext => 'publish' in context); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace-context.interface.ts index 296c70efbc..c268b6c4d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace-context.interface.ts @@ -1,6 +1,6 @@ import type { UmbWorkspaceRouteManager } from '../../index.js'; -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbWorkspaceContext } from './workspace-context.interface.js'; -export interface UmbRoutableWorkspaceContext extends UmbWorkspaceContextInterface { +export interface UmbRoutableWorkspaceContext extends UmbWorkspaceContext { readonly routes: UmbWorkspaceRouteManager; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace.context-token.ts index 9520cd4192..36deeebcfe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/routable-workspace.context-token.ts @@ -1,8 +1,9 @@ import type { UmbRoutableWorkspaceContext } from './routable-workspace-context.interface.js'; -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbWorkspaceContext } from './workspace-context.interface.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export const UMB_ROUTABLE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbRoutableWorkspaceContext ->('UmbWorkspaceContext', undefined, (context): context is UmbRoutableWorkspaceContext => 'routes' in context); +export const UMB_ROUTABLE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbRoutableWorkspaceContext => 'routes' in context, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace-context.interface.ts index 24d4cd6a16..b9a50d8673 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace-context.interface.ts @@ -1,12 +1,15 @@ -import type { UmbEntityWorkspaceContextInterface } from './entity-workspace-context.interface.js'; +import type { UmbEntityWorkspaceContext } from './entity-workspace-context.interface.js'; import type { UmbRoutableWorkspaceContext } from './routable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -export interface UmbSaveableWorkspaceContextInterface - extends UmbEntityWorkspaceContextInterface, - UmbRoutableWorkspaceContext { +export interface UmbSaveableWorkspaceContext extends UmbEntityWorkspaceContext, UmbRoutableWorkspaceContext { isNew: Observable; getIsNew(): boolean | undefined; save(): Promise; destroy(): void; } +/** + * @deprecated Use `UmbSaveableWorkspaceContext` instead. This token will be removed in the RC version. + * TODO: Remove in RC + */ +export interface UmbSaveableWorkspaceContextInterface extends UmbSaveableWorkspaceContext {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts index ab78a983f2..7e537194ca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/saveable-workspace.context-token.ts @@ -1,14 +1,8 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { - UmbWorkspaceContextInterface, - UmbSaveableWorkspaceContextInterface, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext, UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -export const UMB_SAVEABLE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbSaveableWorkspaceContextInterface ->( +export const UMB_SAVEABLE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, - (context): context is UmbSaveableWorkspaceContextInterface => 'getIsNew' in context, + (context): context is UmbSaveableWorkspaceContext => 'getIsNew' in context, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts index af17e2858c..717c8e5eac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/variant-dataset-workspace-context.interface.ts @@ -1,12 +1,12 @@ import type { UmbWorkspaceSplitViewManager } from '../../controllers/workspace-split-view-manager.controller.js'; import type { UmbPropertyDatasetContext } from '../../../property/property-dataset/property-dataset-context.interface.js'; -import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; +import type { UmbSaveableWorkspaceContext } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbVariantId, UmbVariantModel, UmbVariantOptionModel } from '@umbraco-cms/backoffice/variant'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export interface UmbVariantDatasetWorkspaceContextInterface - extends UmbSaveableWorkspaceContextInterface { +export interface UmbVariantDatasetWorkspaceContext + extends UmbSaveableWorkspaceContext { // Name: getName(variantId?: UmbVariantId): string | undefined; setName(name: string, variantId?: UmbVariantId): void; @@ -33,4 +33,4 @@ export interface UmbVariantDatasetWorkspaceContextInterface( - 'UmbWorkspaceContext', - undefined, - (context): context is UmbVariantDatasetWorkspaceContextInterface => 'variants' in context, -); + UmbWorkspaceContext, + UmbVariantDatasetWorkspaceContext +>('UmbWorkspaceContext', undefined, (context): context is UmbVariantDatasetWorkspaceContext => 'variants' in context); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts index 1bfffe1c90..de4c7e1535 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace-context.interface.ts @@ -1,6 +1,13 @@ import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export interface UmbWorkspaceContextInterface extends UmbApi { +export interface UmbWorkspaceContext extends UmbApi { readonly workspaceAlias: string; getEntityType(): string; } + +/** + * @deprecated Use UmbWorkspaceContext instead — Will be removed before RC. + * Notice if you have complains on missing `getUnique()` then you need to use UmbEntityWorkspaceContext instead. + * TODO: Delete before RC. + */ +export interface UmbWorkspaceContextInterface extends UmbWorkspaceContext {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace.context-token.ts index e1a8855cee..2b393c54b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/workspace.context-token.ts @@ -1,4 +1,4 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbWorkspaceContext } from './workspace-context.interface.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export const UMB_WORKSPACE_CONTEXT = new UmbContextToken('UmbWorkspaceContext'); +export const UMB_WORKSPACE_CONTEXT = new UmbContextToken('UmbWorkspaceContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts index 15240a989c..85b8dbf8ab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts @@ -1,4 +1,4 @@ -import type { UmbSaveableWorkspaceContextInterface } from '../../contexts/tokens/saveable-workspace-context.interface.js'; +import type { UmbSaveableWorkspaceContext } from '../../contexts/tokens/saveable-workspace-context.interface.js'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -10,7 +10,7 @@ export class UmbEditableWorkspaceElement extends UmbLitElement { @state() _routes: UmbRoute[] = []; - public set api(api: UmbSaveableWorkspaceContextInterface) { + public set api(api: UmbSaveableWorkspaceContext) { this.observe(api.routes.routes, (routes) => (this._routes = routes)); new UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'workspaceContext', [api]); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts index 266f160333..5187570626 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts @@ -3,13 +3,13 @@ import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import type { UmbInvariantDatasetWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbInvariantDatasetWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; /** * A property dataset context that hooks directly into the workspace context. */ export class UmbInvariantWorkspacePropertyDatasetContext< - WorkspaceType extends UmbInvariantDatasetWorkspaceContextInterface = UmbInvariantDatasetWorkspaceContextInterface, + WorkspaceType extends UmbInvariantDatasetWorkspaceContext = UmbInvariantDatasetWorkspaceContext, > extends UmbContextBase implements UmbPropertyDatasetContext, UmbNameablePropertyDatasetContext diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context-token.ts index 0604febd3f..f3f71750d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context-token.ts @@ -1,11 +1,8 @@ import type { UmbDataTypeWorkspaceContext } from './data-type-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbDataTypeWorkspaceContext ->( +export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, (context): context is UmbDataTypeWorkspaceContext => context.getEntityType?.() === 'data-type', diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts index b906f2a538..446c91ab20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts @@ -3,7 +3,7 @@ import type { UmbDataTypeDetailModel } from '../types.js'; import { UmbDataTypeWorkspaceEditorElement } from './data-type-workspace-editor.element.js'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import type { - UmbInvariantDatasetWorkspaceContextInterface, + UmbInvariantDatasetWorkspaceContext, UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; import { @@ -33,7 +33,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice type EntityType = UmbDataTypeDetailModel; export class UmbDataTypeWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbInvariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbInvariantDatasetWorkspaceContext, UmbRoutableWorkspaceContext { // public readonly repository: UmbDataTypeDetailRepository = new UmbDataTypeDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context-token.ts index 06413a52f6..d5597f3763 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context-token.ts @@ -1,9 +1,9 @@ import type { UmbDictionaryWorkspaceContext } from './dictionary-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_DICTIONARY_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbDictionaryWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts index 62d6828757..813a15c8b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbDictionaryDetailRepository } from '../repository/index.js'; import type { UmbDictionaryDetailModel } from '../types.js'; import { UmbDictionaryWorkspaceEditorElement } from './dictionary-workspace-editor.element.js'; import { - type UmbSaveableWorkspaceContextInterface, + type UmbSaveableWorkspaceContext, UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, @@ -16,7 +16,7 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice export class UmbDictionaryWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { // public readonly detailRepository = new UmbDictionaryDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context-token.ts index 6fc579e6e0..712e436906 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context-token.ts @@ -1,9 +1,9 @@ import type { UmbDocumentTypeWorkspaceContext } from './document-type-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbDocumentTypeWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context-token.ts index 65cb0d1ec3..47f40626cb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context-token.ts @@ -1,10 +1,10 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import type { UmbDocumentWorkspaceContext } from './document-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_DOCUMENT_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbDocumentWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index abb330b1b5..451046c4ba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -28,9 +28,9 @@ import { UmbWorkspaceSplitViewManager, } from '@umbraco-cms/backoffice/workspace'; import type { - UmbCollectionWorkspaceContextInterface, - UmbVariantDatasetWorkspaceContextInterface, - UmbPublishableWorkspaceContextInterface, + UmbCollectionWorkspaceContext, + UmbVariantDatasetWorkspaceContext, + UmbPublishableWorkspaceContext, UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; import { @@ -54,9 +54,9 @@ export class UmbDocumentWorkspaceContext extends UmbSaveableWorkspaceContextBase implements UmbRoutableWorkspaceContext, - UmbVariantDatasetWorkspaceContextInterface, - UmbPublishableWorkspaceContextInterface, - UmbCollectionWorkspaceContextInterface + UmbVariantDatasetWorkspaceContext, + UmbPublishableWorkspaceContext, + UmbCollectionWorkspaceContext { public readonly repository = new UmbDocumentDetailRepository(this); public readonly publishingRepository = new UmbDocumentPublishingRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context-token.ts index dccc8de0cf..fd6f1c74df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context-token.ts @@ -1,9 +1,9 @@ import type { UmbLanguageWorkspaceContext } from './language-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_LANGUAGE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbLanguageWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts index 3175d28fb9..815845eb6a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbLanguageDetailRepository } from '../../repository/index.js'; import type { UmbLanguageDetailModel } from '../../types.js'; import { UmbLanguageWorkspaceEditorElement } from './language-workspace-editor.element.js'; import { - type UmbSaveableWorkspaceContextInterface, + type UmbSaveableWorkspaceContext, UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, @@ -13,7 +13,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbLanguageWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { public readonly repository: UmbLanguageDetailRepository = new UmbLanguageDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/logviewer-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/logviewer-workspace.context.ts index 9862431d36..73af896920 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/logviewer-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/logviewer-workspace.context.ts @@ -13,7 +13,7 @@ import { DirectionModel, LogLevelModel } from '@umbraco-cms/backoffice/external/ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { query } from '@umbraco-cms/backoffice/router'; -import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; export type PoolingInterval = 0 | 2000 | 5000 | 10000 | 20000 | 30000; @@ -27,7 +27,7 @@ export interface LogViewerDateRange { } // TODO: Revisit usage of workspace for this case... -export class UmbLogViewerWorkspaceContext extends UmbControllerBase implements UmbWorkspaceContextInterface { +export class UmbLogViewerWorkspaceContext extends UmbControllerBase implements UmbWorkspaceContext { public readonly workspaceAlias: string = 'Umb.Workspace.LogViewer'; #repository: UmbLogViewerRepository; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context-token.ts index c0e20a1550..74e55cb85e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context-token.ts @@ -1,9 +1,9 @@ import type { UmbMediaTypeWorkspaceContext } from './media-type-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_MEDIA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbMediaTypeWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context-token.ts index a467048308..24ffa52a23 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context-token.ts @@ -1,12 +1,9 @@ import { UMB_MEDIA_ENTITY_TYPE } from '../entity.js'; import type { UmbMediaWorkspaceContext } from './media-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -export const UMB_MEDIA_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, - UmbMediaWorkspaceContext ->( +export const UMB_MEDIA_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, (context): context is UmbMediaWorkspaceContext => context.getEntityType?.() === UMB_MEDIA_ENTITY_TYPE, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index 86fedb04a4..0c9ec4e81f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -6,8 +6,8 @@ import type { UmbMediaDetailModel, UmbMediaVariantModel, UmbMediaVariantOptionMo import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import type { - UmbCollectionWorkspaceContextInterface, - UmbVariantDatasetWorkspaceContextInterface, + UmbCollectionWorkspaceContext, + UmbVariantDatasetWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; import { UmbSaveableWorkspaceContextBase, @@ -34,9 +34,7 @@ import UmbMediaWorkspaceEditorElement from './media-workspace-editor.element.js' type EntityType = UmbMediaDetailModel; export class UmbMediaWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements - UmbVariantDatasetWorkspaceContextInterface, - UmbCollectionWorkspaceContextInterface + implements UmbVariantDatasetWorkspaceContext, UmbCollectionWorkspaceContext { // public readonly repository = new UmbMediaDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context-token.ts index e8dc975186..45835e08e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context-token.ts @@ -1,9 +1,9 @@ import type { UmbMemberGroupWorkspaceContext } from './member-group-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_MEMBER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbMemberGroupWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts index cf20bd3a20..493df687f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts @@ -3,7 +3,7 @@ import type { UmbMemberGroupDetailModel } from '../types.js'; import { UMB_MEMBER_GROUP_WORKSPACE_ALIAS } from './manifests.js'; import { UmbMemberGroupWorkspaceEditorElement } from './member-group-workspace-editor.element.js'; import { - type UmbSaveableWorkspaceContextInterface, + type UmbSaveableWorkspaceContext, UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, @@ -14,7 +14,7 @@ import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; export class UmbMemberGroupWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { public readonly repository = new UmbMemberGroupDetailRepository(this); #getDataPromise?: Promise; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context-token.ts index 3307c71b19..fe736c7d78 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context-token.ts @@ -1,9 +1,9 @@ import type { UmbMemberTypeWorkspaceContext } from './member-type-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_MEMBER_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbMemberTypeWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context-token.ts index a70bdcd274..4cbc630994 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context-token.ts @@ -1,11 +1,8 @@ import type { UmbMemberWorkspaceContext } from './member-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, - UmbMemberWorkspaceContext ->( +export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === 'member', diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts index 56bdd3bc42..d63808ed04 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts @@ -10,10 +10,7 @@ import { UmbWorkspaceRouteManager, UmbWorkspaceSplitViewManager, } from '@umbraco-cms/backoffice/workspace'; -import type { - UmbRoutableWorkspaceContext, - UmbVariantDatasetWorkspaceContextInterface, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbRoutableWorkspaceContext, UmbVariantDatasetWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbArrayState, @@ -30,7 +27,7 @@ import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; type EntityType = UmbMemberDetailModel; export class UmbMemberWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbVariantDatasetWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbVariantDatasetWorkspaceContext, UmbRoutableWorkspaceContext { public readonly repository = new UmbMemberDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context-token.ts index a9c560302b..2fcb61a826 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context-token.ts @@ -1,9 +1,9 @@ import type { UmbRelationTypeWorkspaceContext } from './relation-type-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_RELATION_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbRelationTypeWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts index 7ad1f62a4a..ff08db2841 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts @@ -1,7 +1,7 @@ import { UmbRelationTypeRepository } from '../repository/relation-type.repository.js'; import { UmbRelationTypeWorkspaceEditorElement } from './relation-type-workspace-editor.element.js'; import { - type UmbSaveableWorkspaceContextInterface, + type UmbSaveableWorkspaceContext, UmbSaveableWorkspaceContextBase, type UmbRoutableWorkspaceContext, UmbWorkspaceRouteManager, @@ -13,7 +13,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbRelationTypeWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { // public readonly repository: UmbRelationTypeRepository = new UmbRelationTypeRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/code-editor/code-editor.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/code-editor/code-editor.stories.ts index cb94bb5bfc..df07650c41 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/code-editor/code-editor.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/code-editor/code-editor.stories.ts @@ -113,7 +113,7 @@ const codeSnippets: Record = { "Smartypants, double quotes" and 'single quotes'`, typescript: `import { UmbTemplateRepository } from '../repository/template.repository.js'; - import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context.js'; + import { UmbWorkspaceContextBase } from '../../../shared/components/workspace/workspace-context/workspace-context.js'; import { UmbObjectState } from '@umbraco-cms/observable-api'; import { TemplateModel } from '@umbraco-cms/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/controller'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context-token.ts index cd524599bf..d17a5ae6f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context-token.ts @@ -1,10 +1,10 @@ import { UMB_PARTIAL_VIEW_ENTITY_TYPE } from '../entity.js'; import type { UmbPartialViewWorkspaceContext } from './partial-view-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbPartialViewWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts index 0bb2c2e2a8..52e112a76a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts @@ -4,10 +4,7 @@ import { UMB_PARTIAL_VIEW_ENTITY_TYPE } from '../entity.js'; import { UmbPartialViewWorkspaceEditorElement } from './partial-view-workspace-editor.element.js'; import { UmbBooleanState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { - UmbRoutableWorkspaceContext, - UmbSaveableWorkspaceContextInterface, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbRoutableWorkspaceContext, UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, @@ -23,7 +20,7 @@ import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router export class UmbPartialViewWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { public readonly repository = new UmbPartialViewDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context-token.ts index 84fcd4c0d6..c5dd0234b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context-token.ts @@ -1,11 +1,8 @@ import type { UmbScriptWorkspaceContext } from './script-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -export const UMB_SCRIPT_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContextInterface, - UmbScriptWorkspaceContext ->( +export const UMB_SCRIPT_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, (context): context is UmbScriptWorkspaceContext => context.getEntityType?.() === 'script', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts index 60564ba5e7..07104330f9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts @@ -8,7 +8,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbSaveableWorkspaceContextBase, type UmbRoutableWorkspaceContext, - type UmbSaveableWorkspaceContextInterface, + type UmbSaveableWorkspaceContext, UmbWorkspaceIsNewRedirectController, UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; @@ -20,7 +20,7 @@ import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router export class UmbScriptWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { public readonly repository = new UmbScriptDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context-token.ts index cb0c5e25af..71b9cda4f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context-token.ts @@ -1,10 +1,10 @@ import { UMB_STYLESHEET_ENTITY_TYPE } from '../entity.js'; import type { UmbStylesheetWorkspaceContext } from './stylesheet-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_STYLESHEET_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbStylesheetWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index 80726a7ab6..c38d908461 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -4,7 +4,7 @@ import { UMB_STYLESHEET_ENTITY_TYPE } from '../entity.js'; import { UMB_STYLESHEET_WORKSPACE_ALIAS } from './manifests.js'; import { UmbStylesheetWorkspaceEditorElement } from './stylesheet-workspace-editor.element.js'; import { - type UmbSaveableWorkspaceContextInterface, + type UmbSaveableWorkspaceContext, UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, @@ -20,7 +20,7 @@ import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router export class UmbStylesheetWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { public readonly repository = new UmbStylesheetDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context-token.ts index 808766310c..34029fdd7d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context-token.ts @@ -1,9 +1,9 @@ import type { UmbTemplateWorkspaceContext } from './template-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_TEMPLATE_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbTemplateWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts index 0809f1a8dc..0e36439986 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts @@ -4,10 +4,7 @@ import { UmbTemplateDetailRepository, UmbTemplateItemRepository } from '../repos import { UMB_TEMPLATE_WORKSPACE_ALIAS } from './manifests.js'; import { UmbTemplateWorkspaceEditorElement } from './template-workspace-editor.element.js'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; -import type { - UmbRoutableWorkspaceContext, - UmbSaveableWorkspaceContextInterface, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbRoutableWorkspaceContext, UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, @@ -22,7 +19,7 @@ import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router export class UmbTemplateWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { public readonly detailRepository = new UmbTemplateDetailRepository(this); public readonly itemRepository = new UmbTemplateItemRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context-token.ts index 3303651a97..d9f70a906b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context-token.ts @@ -1,10 +1,10 @@ import { UMB_USER_GROUP_ENTITY_TYPE } from '../index.js'; import type { UmbUserGroupWorkspaceContext } from './user-group-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSaveableWorkspaceContext, UmbUserGroupWorkspaceContext >( 'UmbWorkspaceContext', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index 9111a48899..54b7390b03 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -2,10 +2,7 @@ import { UmbUserGroupDetailRepository } from '../repository/detail/index.js'; import type { UmbUserGroupDetailModel } from '../types.js'; import { UmbUserGroupWorkspaceEditorElement } from './user-group-workspace-editor.element.js'; import type { UmbUserPermissionModel } from '@umbraco-cms/backoffice/user-permission'; -import type { - UmbRoutableWorkspaceContext, - UmbSaveableWorkspaceContextInterface, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbRoutableWorkspaceContext, UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbSaveableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, @@ -16,7 +13,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbUserGroupWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface, UmbRoutableWorkspaceContext + implements UmbSaveableWorkspaceContext, UmbRoutableWorkspaceContext { // public readonly repository: UmbUserGroupDetailRepository = new UmbUserGroupDetailRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context-token.ts index fdf725a359..bd3fc158b0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context-token.ts @@ -1,12 +1,9 @@ import { UMB_USER_ENTITY_TYPE } from '../entity.js'; import type { UmbUserWorkspaceContext } from './user-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -export const UMB_USER_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, - UmbUserWorkspaceContext ->( +export const UMB_USER_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', undefined, (context): context is UmbUserWorkspaceContext => context.getEntityType?.() === UMB_USER_ENTITY_TYPE, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts index 8c91a4c436..c83f21c2f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts @@ -4,7 +4,7 @@ import { UmbUserDetailRepository } from '../repository/index.js'; import { UmbUserAvatarRepository } from '../repository/avatar/index.js'; import { UMB_USER_WORKSPACE_ALIAS } from './manifests.js'; import { UmbUserWorkspaceEditorElement } from './user-workspace-editor.element.js'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbSaveableWorkspaceContextBase, UmbWorkspaceRouteManager } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; @@ -13,7 +13,7 @@ type EntityType = UmbUserDetailModel; export class UmbUserWorkspaceContext extends UmbSaveableWorkspaceContextBase - implements UmbSaveableWorkspaceContextInterface + implements UmbSaveableWorkspaceContext { public readonly detailRepository: UmbUserDetailRepository = new UmbUserDetailRepository(this); public readonly avatarRepository: UmbUserAvatarRepository = new UmbUserAvatarRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts index 271ae6230e..7b1a61f4c9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/webhook-workspace.context.ts @@ -2,10 +2,10 @@ import { UMB_WEBHOOK_ENTITY_TYPE, UMB_WEBHOOK_WORKSPACE } from '../../entity.js' import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; -export class UmbWebhookWorkspaceContext extends UmbControllerBase implements UmbWorkspaceContextInterface { +export class UmbWebhookWorkspaceContext extends UmbControllerBase implements UmbWorkspaceContext { public readonly workspaceAlias = UMB_WEBHOOK_WORKSPACE; getEntityType() { From 2f293d321726a45354e5589ca6ff96ac356db6ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 11:26:39 +0100 Subject: [PATCH 19/29] fix test --- .../core/workspace/kinds/editable/editable-workspace.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts index 0935da84a5..e0f2d541ca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts @@ -6,7 +6,7 @@ describe('UmbEditableWorkspaceElement', () => { let element: UmbEditableWorkspaceElement; beforeEach(async () => { - element = await fixture(html``); + element = await fixture(html``); }); it('is defined with its own instance', () => { From b941108cd84463ece2eb137b676142421dbab3ae Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:59:38 +0100 Subject: [PATCH 20/29] add json schema `allowPublicAccess` --- .../src/packages/core/extension-registry/umbraco-package.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/umbraco-package.ts index 7663b53c2c..3a05a2d7f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/umbraco-package.ts @@ -27,6 +27,12 @@ export interface UmbracoPackage { */ allowTelemetry?: boolean; + /** + * @title Decides if the package is allowed to be accessed by the public, e.g. on the login screen + * @default false + */ + allowPublicAccess?: boolean; + /** * @title An array of Umbraco package manifest types that will be installed * @required From daede7ab8a243c420d6a6c1b8739b91053b31055 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:00:09 +0100 Subject: [PATCH 21/29] add method to allow loading public extensions and ensure the backoffice still loads all extensions --- .../src/apps/backoffice/backoffice.element.ts | 2 +- ...server-extension-registrator.controller.ts | 108 ++++++++++-------- 2 files changed, 62 insertions(+), 48 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts index 51c2146779..4a5456b67f 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts @@ -55,7 +55,7 @@ export class UmbBackofficeElement extends UmbLitElement { new UmbBackofficeContext(this); new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); - new UmbServerExtensionRegistrator(this, umbExtensionsRegistry); + new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerAllExtensions(); // So far local packages are this simple to registerer, so no need for a manager to do that: CORE_PACKAGES.forEach(async (packageImport) => { diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts index 0f13864082..58226d9dea 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts @@ -1,4 +1,8 @@ -import { PackageResource, OpenAPI } from '@umbraco-cms/backoffice/external/backend-api'; +import { + PackageResource, + OpenAPI, + type PackageManifestResponseModel, +} from '@umbraco-cms/backoffice/external/backend-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -14,56 +18,66 @@ export class UmbServerExtensionRegistrator extends UmbControllerBase { constructor(host: UmbControllerHost, extensionRegistry: UmbBackofficeExtensionRegistry) { super(host, UmbServerExtensionRegistrator.name); this.#extensionRegistry = extensionRegistry; - this.#loadServerPackages(); } - async #loadServerPackages() { - /* TODO: we need a new endpoint here, to remove the dependency on the package repository, to get the modules available for the backoffice scope - / we will need a similar endpoint for the login, installer etc at some point. - We should expose more information about the packages when not authorized so the end point should only return a list of modules from the manifest with - with the correct scope. - - This code is copy pasted from the package repository. We probably don't need this is the package repository anymore. - */ + /** + * Registers all extensions from the server. + * This is used to register all extensions that are available to the user (including private extensions). + * @remark Users must have the BACKOFFICE_ACCESS permission to access this method. + */ + public async registerAllExtensions() { const { data: packages } = await tryExecuteAndNotify(this, PackageResource.getPackageManifest()); - if (packages) { - // Append packages to the store but only if they have a name - //store.appendItems(packages.filter((p) => p.name?.length)); - const extensions: ManifestBase[] = []; - - packages.forEach((p) => { - p.extensions?.forEach((e) => { - // Crudely validate that the extension at least follows a basic manifest structure - // Idea: Use `Zod` to validate the manifest - if (isManifestBaseType(e)) { - /** - * Crude check to see if extension is of type "js" since it is safe to assume we do not - * need to load any other types of extensions in the backoffice (we need a js file to load) - */ - - // TODO: add helper to check for relative paths - // Add base url if the js path is relative - if ('js' in e && typeof e.js === 'string' && !e.js.startsWith('http')) { - e.js = `${this.#apiBaseUrl}${e.js}`; - } - - // Add base url if the element path is relative - if ('element' in e && typeof e.element === 'string' && !e.element.startsWith('http')) { - e.element = `${this.#apiBaseUrl}${e.element}`; - } - - // Add base url if the element path api relative - if ('api' in e && typeof e.api === 'string' && !e.api.startsWith('http')) { - e.api = `${this.#apiBaseUrl}${e.api}`; - } - - extensions.push(e); - } - }); - }); - - this.#extensionRegistry.registerMany(extensions); + await this.#loadServerPackages(packages); } } + + /** + * Registers all public extensions from the server. + * This is used to register all extensions that are available to the user (excluding private extensions) such as login extensions. + * @remark Any user can access this method without any permissions. + */ + public async registerPublicExtensions() { + const { data: packages } = await tryExecuteAndNotify(this, PackageResource.getPackageManifestPublic()); + if (packages) { + await this.#loadServerPackages(packages); + } + } + + async #loadServerPackages(packages: PackageManifestResponseModel[]) { + const extensions: ManifestBase[] = []; + + packages.forEach((p) => { + p.extensions?.forEach((e) => { + // Crudely validate that the extension at least follows a basic manifest structure + // Idea: Use `Zod` to validate the manifest + if (isManifestBaseType(e)) { + /** + * Crude check to see if extension is of type "js" since it is safe to assume we do not + * need to load any other types of extensions in the backoffice (we need a js file to load) + */ + + // TODO: add helper to check for relative paths + // Add base url if the js path is relative + if ('js' in e && typeof e.js === 'string' && !e.js.startsWith('http')) { + e.js = `${this.#apiBaseUrl}${e.js}`; + } + + // Add base url if the element path is relative + if ('element' in e && typeof e.element === 'string' && !e.element.startsWith('http')) { + e.element = `${this.#apiBaseUrl}${e.element}`; + } + + // Add base url if the element path api relative + if ('api' in e && typeof e.api === 'string' && !e.api.startsWith('http')) { + e.api = `${this.#apiBaseUrl}${e.api}`; + } + + extensions.push(e); + } + }); + }); + + this.#extensionRegistry.registerMany(extensions); + } } From 6b9afa59c14dbd90a2fcb97c3411681cfbe1a8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 22 Mar 2024 14:19:59 +0100 Subject: [PATCH 22/29] stop composing change event of number range --- .../input-number-range/input-number-range.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts index fca19679e0..9b2c008fb3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.element.ts @@ -72,12 +72,12 @@ export class UmbInputNumberRangeElement extends UmbFormControlMixin(UmbLitElemen private _onMinInput(e: InputEvent) { this.minValue = Number((e.target as HTMLInputElement).value); - this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); + this.dispatchEvent(new CustomEvent('change', { bubbles: true })); } private _onMaxInput(e: InputEvent) { this.maxValue = Number((e.target as HTMLInputElement).value); - this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); + this.dispatchEvent(new CustomEvent('change', { bubbles: true })); } render() { From aea14a5b17dc22dcfbac24536e0c3e963eb8d040 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:27:33 +0100 Subject: [PATCH 23/29] if ui alias --- .../components/ref-data-type/ref-data-type.element.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 04feb80560..faa90c4ad8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -33,7 +33,9 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { this.name = dataType.name ?? ''; this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.propertyEditorSchemaAlias = dataType.editorAlias ?? ''; - this.#getIconFromRegistry(); + if (this.propertyEditorUiAlias) { + this.#getIconFromRegistry(); + } } }, 'dataType', From ece9194e86d702ff58e34f9ccd21634d8a1debb8 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:42:54 +0100 Subject: [PATCH 24/29] explanation --- .../components/ref-data-type/ref-data-type.element.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index faa90c4ad8..2b1277ca45 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -64,15 +64,18 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), async (manifestPropertyEditorUi) => { const icon = manifestPropertyEditorUi?.meta.icon; + /** [LI] We have the icon name now, but because this element extends from uui-ref-node, it wants the icon via the icon slot. + * From what I can see, this is not possible via this file, but this is the file that have the datatype data.... + * Instead, overwriting the fallback icon which requires a SVG... */ if (icon) { - this.#requestIcon(icon); + this.#requestIconSVG(icon); } }, ), '_observeIcon'; } - #requestIcon(iconName: string) { + #requestIconSVG(iconName: string) { if (iconName !== '' && iconName !== null) { const event = new UUIIconRequestEvent(UUIIconRequestEvent.ICON_REQUEST, { detail: { iconName: iconName }, From 0c5fc57d57535898940ec38d904848d2b0d7ac21 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:43:41 +0100 Subject: [PATCH 25/29] typo --- .../data-type/components/ref-data-type/ref-data-type.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 2b1277ca45..8cf43506e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -66,7 +66,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { const icon = manifestPropertyEditorUi?.meta.icon; /** [LI] We have the icon name now, but because this element extends from uui-ref-node, it wants the icon via the icon slot. * From what I can see, this is not possible via this file, but this is the file that have the datatype data.... - * Instead, overwriting the fallback icon which requires a SVG... */ + * Instead, overwriting the fallbackIcon property which requires a SVG... */ if (icon) { this.#requestIconSVG(icon); } From 8dd45abf3b1461aae377474d7ea1713075b3a9ee Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:44:50 +0100 Subject: [PATCH 26/29] rename method --- .../components/ref-data-type/ref-data-type.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 8cf43506e1..4b8e4a3d80 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -34,7 +34,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.propertyEditorSchemaAlias = dataType.editorAlias ?? ''; if (this.propertyEditorUiAlias) { - this.#getIconFromRegistry(); + this.#getIconFromUiAlias(); } } }, @@ -59,7 +59,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { @state() propertyEditorSchemaAlias = ''; - async #getIconFromRegistry() { + async #getIconFromUiAlias() { this.observe( umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), async (manifestPropertyEditorUi) => { From f80c6ca312674352fbf0ef93bb39e00b53945d3e Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:09:19 +0100 Subject: [PATCH 27/29] only check icon when ui alias change --- .../components/ref-data-type/ref-data-type.element.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts index 4b8e4a3d80..e144ad4b2e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/ref-data-type/ref-data-type.element.ts @@ -31,9 +31,9 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { (dataType) => { if (dataType) { this.name = dataType.name ?? ''; - this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.propertyEditorSchemaAlias = dataType.editorAlias ?? ''; - if (this.propertyEditorUiAlias) { + if (dataType.editorUiAlias ?? '' !== this.propertyEditorUiAlias) { + this.propertyEditorUiAlias = dataType.editorUiAlias ?? ''; this.#getIconFromUiAlias(); } } @@ -60,6 +60,7 @@ export class UmbRefDataTypeElement extends UmbElementMixin(UUIRefNodeElement) { propertyEditorSchemaAlias = ''; async #getIconFromUiAlias() { + if (!this.propertyEditorUiAlias) return; this.observe( umbExtensionsRegistry.byTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), async (manifestPropertyEditorUi) => { From 60fe9c64af160ad045fb315b6302c16edc8b6ee8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 23 Mar 2024 20:11:58 +0100 Subject: [PATCH 28/29] add advanced settings menu --- .../extension-registry/menu-item/manifests.ts | 8 +++--- .../extension-root-workspace.element.ts | 5 +++- .../src/packages/core/settings/manifests.ts | 27 ++++++++++++++++++- .../log-viewer/menu-item/manifests.ts | 4 +-- .../relation-types/menu-item/manifests.ts | 4 +-- .../src/packages/templating/menu.manifests.ts | 2 +- 6 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/menu-item/manifests.ts index 300913745e..6604cf0ea2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/menu-item/manifests.ts @@ -3,13 +3,13 @@ import type { ManifestMenuItem } from '@umbraco-cms/backoffice/extension-registr const menuItem: ManifestMenuItem = { type: 'menuItem', alias: 'Umb.MenuItem.Extensions', - name: 'Extensions Menu Item', - weight: 0, + name: 'Extension Insights Menu Item', + weight: 200, meta: { - label: 'Extensions', + label: 'Extension Insights', icon: 'icon-wand', entityType: 'extension-root', - menus: ['Umb.Menu.Settings'], + menus: ['Umb.Menu.AdvancedSettings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/workspace/extension-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/workspace/extension-root-workspace.element.ts index 198f495da2..9c701cf6e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/workspace/extension-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/workspace/extension-root-workspace.element.ts @@ -7,7 +7,10 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; export class UmbExtensionRootWorkspaceElement extends UmbLitElement { render() { return html` - + `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts index 0f84871955..e59669bf01 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts @@ -32,7 +32,7 @@ export const manifests = [ kind: 'menu', alias: 'Umb.SectionSidebarMenu.Settings', name: 'Settings Section Sidebar Menu', - weight: 200, + weight: 300, meta: { label: 'Settings', menu: 'Umb.Menu.Settings', @@ -44,5 +44,30 @@ export const manifests = [ }, ], }, + { + type: 'menu', + alias: 'Umb.Menu.AdvancedSettings', + name: 'Advanced Settings Menu', + meta: { + label: 'Advanced', + }, + }, + { + type: 'sectionSidebarApp', + kind: 'menu', + alias: 'Umb.SectionSidebarMenu.AdvancedSettings', + name: 'Advanced Settings Section Sidebar Menu', + weight: 100, + meta: { + label: 'Advanced', + menu: 'Umb.Menu.AdvancedSettings', + }, + conditions: [ + { + alias: 'Umb.Condition.SectionAlias', + match: UMB_SETTINGS_SECTION_ALIAS, + }, + ], + }, ...welcomeDashboardManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/menu-item/manifests.ts index 90e1fb7c0b..34a5fff422 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/menu-item/manifests.ts @@ -3,13 +3,13 @@ import type { ManifestMenuItem } from '@umbraco-cms/backoffice/extension-registr const menuItem: ManifestMenuItem = { type: 'menuItem', alias: 'Umb.MenuItem.LogViewer', - name: 'LogViewer Menu Item', + name: 'Log Viewer Menu Item', weight: 300, meta: { label: 'Log Viewer', icon: 'icon-box-alt', entityType: 'logviewer', - menus: ['Umb.Menu.Settings'], + menus: ['Umb.Menu.AdvancedSettings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts index ef111632a2..297b8c6f93 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts @@ -6,11 +6,11 @@ const menuItem: ManifestTypes = { kind: 'tree', alias: 'Umb.MenuItem.RelationTypes', name: 'Relation Types Menu Item', - weight: 500, + weight: 100, meta: { treeAlias: UMB_RELATION_TYPE_TREE_ALIAS, label: 'Relation Types', - menus: ['Umb.Menu.Settings'], + menus: ['Umb.Menu.AdvancedSettings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts index 0b1437c2b5..71bd6eb3ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts @@ -16,7 +16,7 @@ const menuSectionSidebarApp: ManifestTypes = { kind: 'menu', alias: 'Umb.SectionSidebarMenu.Templating', name: 'Templating Section Sidebar Menu', - weight: 100, + weight: 200, meta: { label: 'Templating', menu: 'Umb.Menu.Templating', From 7c62663d146e5921c7fc246d52308f256f5a7fc3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 23 Mar 2024 20:16:28 +0100 Subject: [PATCH 29/29] remove unused label from manifest --- .../src/packages/core/settings/manifests.ts | 6 ------ .../src/packages/dictionary/menu/manifests.ts | 3 --- .../src/packages/documents/documents/menu.manifests.ts | 3 --- .../src/packages/media/media/menu.manifests.ts | 3 --- .../src/packages/media/menu.manifests.ts | 3 --- .../src/packages/templating/menu.manifests.ts | 3 --- 6 files changed, 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts index e59669bf01..a87b8da871 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts @@ -23,9 +23,6 @@ export const manifests = [ type: 'menu', alias: 'Umb.Menu.Settings', name: 'Settings Menu', - meta: { - label: 'Settings', - }, }, { type: 'sectionSidebarApp', @@ -48,9 +45,6 @@ export const manifests = [ type: 'menu', alias: 'Umb.Menu.AdvancedSettings', name: 'Advanced Settings Menu', - meta: { - label: 'Advanced', - }, }, { type: 'sectionSidebarApp', diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/menu/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/menu/manifests.ts index bd909ef43c..f11c647652 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/menu/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/menu/manifests.ts @@ -8,9 +8,6 @@ const menu: ManifestMenu = { type: 'menu', alias: UMB_DICTIONARY_MENU_ALIAS, name: 'Dictionary Menu', - meta: { - label: 'Dictionary', - }, }; const menuItem: ManifestMenuItemTreeKind = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/menu.manifests.ts index 6bb7fe2726..72a75a52bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/menu.manifests.ts @@ -6,9 +6,6 @@ const menu: ManifestMenu = { type: 'menu', alias: UMB_CONTENT_MENU_ALIAS, name: 'Content Menu', - meta: { - label: 'Content', - }, }; export const manifests = [menu]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/menu.manifests.ts index 7f7f2a0444..b10c33a8be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/menu.manifests.ts @@ -6,9 +6,6 @@ const menu: ManifestMenu = { type: 'menu', alias: UMB_MEDIA_MENU_ALIAS, name: 'Media Menu', - meta: { - label: 'Media', - }, }; export const manifests = [menu]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/menu.manifests.ts index cdefc905ff..a807f482be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/menu.manifests.ts @@ -4,9 +4,6 @@ const menu: ManifestMenu = { type: 'menu', alias: 'Umb.Menu.Media', name: 'Media Menu', - meta: { - label: 'Media', - }, }; export const manifests = [menu]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts index 71bd6eb3ee..a353119dea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/menu.manifests.ts @@ -6,9 +6,6 @@ const menu: ManifestMenu = { type: 'menu', alias: 'Umb.Menu.Templating', name: 'Templating Menu', - meta: { - label: 'Templating', - }, }; const menuSectionSidebarApp: ManifestTypes = {