From 9195b5b6313aa2fb562b39129236d03217268324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 22 Aug 2023 22:19:44 +0200 Subject: [PATCH 01/75] ability to set discriminator method --- .../context-api/consume/context-consumer.ts | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts index 1c9191de7b..ec3ef625d3 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts @@ -7,55 +7,77 @@ import { } from '../provide/context-provide.event.js'; import { UmbContextRequestEventImplementation, UmbContextCallback } from './context-request.event.js'; +export type UmbContextDiscriminator = (instance: T) => instance is DiscriminatorResult; + /** * @export * @class UmbContextConsumer */ -export class UmbContextConsumer { - #callback?: UmbContextCallback; - #promise?: Promise; - #promiseResolver?: (instance: T) => void; +export class UmbContextConsumer { + #callback?: UmbContextCallback; + #promise?: Promise; + #promiseResolver?: (instance: D) => void; - #instance?: T; + #instance?: D; get instance() { return this.#instance; } #contextAlias: string; + #discriminator?: UmbContextDiscriminator; + /** * Creates an instance of UmbContextConsumer. * @param {EventTarget} hostElement * @param {string} contextAlias - * @param {UmbContextCallback} _callback + * @param {UmbContextCallback} callback * @memberof UmbContextConsumer */ constructor( protected hostElement: EventTarget, contextAlias: string | UmbContextToken, - callback?: UmbContextCallback + callback?: UmbContextCallback, + discriminator?: UmbContextDiscriminator ) { this.#contextAlias = contextAlias.toString(); this.#callback = callback; + this.#discriminator = discriminator; } - /* Idea: Niels: If we need to filter for specific contexts, we could make the response method return true/false. If false, the event should then then not be stopped. Alternatively parse the event it self on to the response-callback. This will enable the event to continue to bubble up finding a context that matches. The reason for such would be to have some who are more specific than others. For example, some might just need the current workspace-context, others might need the closest handling a certain entityType. As I'm writting this is not relevant, but I wanted to keep the idea as we have had some circumstance that might be solved with this approach.*/ + + /* Idea: Niels: If we need to filter for specific contexts, we could make the response method return true/false. If false, the event should then then not be stopped. Alternatively parse the event it self on to the response-callback. + This will enable the event to continue to bubble up finding a context that matches. + The reason for such would be to have some who are more specific than others. For example, some might just need the current workspace-context, others might need the closest handling a certain entityType. + As I'm writing this is not relevant, but I wanted to keep the idea as we have had some circumstance that might be solved with this approach. + */ protected _onResponse = (instance: T) => { if (this.#instance === instance) { return; } + if(this.#discriminator) { + // Notice if discriminator returns false, we do not want to setInstance. + if(this.#discriminator(instance)) { + this.setInstance(instance); + } + } else { + this.setInstance(instance as D); + } + }; + + protected setInstance(instance: D) { this.#instance = instance; this.#callback?.(instance); if (instance !== undefined) { this.#promiseResolver?.(instance); this.#promise = undefined; } - }; + } public asPromise() { return ( this.#promise ?? - (this.#promise = new Promise((resolve) => { + (this.#promise = new Promise((resolve) => { this.#instance ? resolve(this.#instance) : (this.#promiseResolver = resolve); })) ); From e12f4491c84c9d23ad65c4bff295f8b511d40303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 22 Aug 2023 22:20:35 +0200 Subject: [PATCH 02/75] test context discriminator --- .../consume/context-consumer.test.ts | 84 ++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts index 4a520a3518..2134b77bd0 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts @@ -6,7 +6,7 @@ import { UmbContextRequestEventImplementation, umbContextRequestEventType } from const testContextAlias = 'my-test-context'; class UmbTestContextConsumerClass { - prop = 'value from provider'; + public prop: string = 'value from provider'; } describe('UmbContextConsumer', () => { @@ -18,6 +18,11 @@ describe('UmbContextConsumer', () => { }); describe('Public API', () => { + describe('properties', () => { + it('has a instance property', () => { + expect(consumer).to.have.property('instance').that.is.undefined; + }); + }); describe('methods', () => { it('has a request method', () => { expect(consumer).to.have.property('request').that.is.a('function'); @@ -34,6 +39,7 @@ describe('UmbContextConsumer', () => { expect(event).to.exist; expect(event.type).to.eq(umbContextRequestEventType); expect(event.contextAlias).to.eq(testContextAlias); + consumer.hostDisconnected(); }); }); }); @@ -90,3 +96,79 @@ describe('UmbContextConsumer', () => { }); */ }); + +describe('UmbContextConsumer with discriminator test', () => { + + type A = { prop: string }; + + function discriminator(instance: unknown): instance is A { + return typeof (instance as any).prop === 'string'; + } + + function badDiscriminator(instance: unknown): instance is A { + return typeof (instance as any).notExistingProp === 'string'; + } + + describe('discriminator type', () => { + it('discriminator determines the instance type', async () => { + + const localConsumer = new UmbContextConsumer(document.body, testContextAlias, (instance: A) => { console.log(instance)}, discriminator); + localConsumer.hostConnected(); + + // This bit of code is just to make sure the type is correct. + type TestType = Exclude<(typeof localConsumer.instance), undefined> extends A ? true : never; + const test: TestType = true; + expect(test).to.be.true; + + localConsumer.destroy(); + }); + }); + + + it('approving discriminator still fires callback', (done) => { + const provider = new UmbContextProvider(document.body, testContextAlias, new UmbTestContextConsumerClass()); + provider.hostConnected(); + + const element = document.createElement('div'); + document.body.appendChild(element); + + const localConsumer = new UmbContextConsumer( + element, + testContextAlias, + (_instance) => { + expect(_instance.prop).to.eq('value from provider'); + done(); + localConsumer.hostDisconnected(); + provider.hostDisconnected(); + }, + discriminator + ); + localConsumer.hostConnected(); + }); + + it('disapproving discriminator does not fire callback', (done) => { + const provider = new UmbContextProvider(document.body, testContextAlias, new UmbTestContextConsumerClass()); + provider.hostConnected(); + + const element = document.createElement('div'); + document.body.appendChild(element); + + const localConsumer = new UmbContextConsumer( + element, + testContextAlias, + (_instance) => { + expect(_instance.prop).to.eq('this must not happen!'); + }, + badDiscriminator + ); + localConsumer.hostConnected(); + + Promise.resolve().then(() => { + done(); + localConsumer.hostDisconnected(); + provider.hostDisconnected(); + }); + }); + + +}); From 551ba02351ef6024dfd67802a273470fb09ade05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 23 Aug 2023 10:27:59 +0200 Subject: [PATCH 03/75] clean up --- .../consume/context-consumer.test.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts index 2134b77bd0..57c754f35d 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts @@ -109,22 +109,19 @@ describe('UmbContextConsumer with discriminator test', () => { return typeof (instance as any).notExistingProp === 'string'; } - describe('discriminator type', () => { - it('discriminator determines the instance type', async () => { + it('discriminator determines the instance type', async () => { - const localConsumer = new UmbContextConsumer(document.body, testContextAlias, (instance: A) => { console.log(instance)}, discriminator); - localConsumer.hostConnected(); + const localConsumer = new UmbContextConsumer(document.body, testContextAlias, (instance: A) => { console.log(instance)}, discriminator); + localConsumer.hostConnected(); - // This bit of code is just to make sure the type is correct. - type TestType = Exclude<(typeof localConsumer.instance), undefined> extends A ? true : never; - const test: TestType = true; - expect(test).to.be.true; + // This bit of code is just to make sure the type is correct. + type TestType = Exclude<(typeof localConsumer.instance), undefined> extends A ? true : never; + const test: TestType = true; + expect(test).to.be.true; - localConsumer.destroy(); - }); + localConsumer.destroy(); }); - it('approving discriminator still fires callback', (done) => { const provider = new UmbContextProvider(document.body, testContextAlias, new UmbTestContextConsumerClass()); provider.hostConnected(); From d93ac1c69404f324c9794c915cd61a8bc3612927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 23 Aug 2023 15:08:01 +0200 Subject: [PATCH 04/75] Embed the discriminator method in ContextToken --- .../consume/context-consumer.test.ts | 19 +++++++----- .../context-api/consume/context-consumer.ts | 31 +++++++++---------- .../libs/context-api/token/context-token.ts | 24 +++++++++----- 3 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts index 57c754f35d..e3b82c2da9 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts @@ -1,5 +1,6 @@ import { expect, oneEvent } from '@open-wc/testing'; import { UmbContextProvider } from '../provide/context-provider.js'; +import { UmbContextToken } from '../token/context-token.js'; import { UmbContextConsumer } from './context-consumer.js'; import { UmbContextRequestEventImplementation, umbContextRequestEventType } from './context-request.event.js'; @@ -111,10 +112,14 @@ describe('UmbContextConsumer with discriminator test', () => { it('discriminator determines the instance type', async () => { - const localConsumer = new UmbContextConsumer(document.body, testContextAlias, (instance: A) => { console.log(instance)}, discriminator); + const localConsumer = new UmbContextConsumer( + document.body, + new UmbContextToken(testContextAlias, discriminator), + (instance: A) => { console.log(instance)} + ); localConsumer.hostConnected(); - // This bit of code is just to make sure the type is correct. + // This bit of code is not really a test but it serves as a TypeScript type test, making sure the given type is matches the one given from the Discriminator method. type TestType = Exclude<(typeof localConsumer.instance), undefined> extends A ? true : never; const test: TestType = true; expect(test).to.be.true; @@ -131,14 +136,13 @@ describe('UmbContextConsumer with discriminator test', () => { const localConsumer = new UmbContextConsumer( element, - testContextAlias, + new UmbContextToken(testContextAlias, discriminator), (_instance) => { expect(_instance.prop).to.eq('value from provider'); done(); localConsumer.hostDisconnected(); provider.hostDisconnected(); - }, - discriminator + } ); localConsumer.hostConnected(); }); @@ -152,11 +156,10 @@ describe('UmbContextConsumer with discriminator test', () => { const localConsumer = new UmbContextConsumer( element, - testContextAlias, + new UmbContextToken(testContextAlias, badDiscriminator), (_instance) => { expect(_instance.prop).to.eq('this must not happen!'); - }, - badDiscriminator + } ); localConsumer.hostConnected(); diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts index ec3ef625d3..f671be1a38 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts @@ -1,4 +1,4 @@ -import { UmbContextToken } from '../token/context-token.js'; +import { UmbContextDiscriminator, UmbContextToken } from '../token/context-token.js'; import { isUmbContextProvideEventType, //isUmbContextUnprovidedEventType, @@ -7,25 +7,23 @@ import { } from '../provide/context-provide.event.js'; import { UmbContextRequestEventImplementation, UmbContextCallback } from './context-request.event.js'; -export type UmbContextDiscriminator = (instance: T) => instance is DiscriminatorResult; - /** * @export * @class UmbContextConsumer */ -export class UmbContextConsumer { - #callback?: UmbContextCallback; - #promise?: Promise; - #promiseResolver?: (instance: D) => void; +export class UmbContextConsumer { + #callback?: UmbContextCallback; + #promise?: Promise; + #promiseResolver?: (instance: DiscriminatedType) => void; - #instance?: D; + #instance?: DiscriminatedType; get instance() { return this.#instance; } #contextAlias: string; - #discriminator?: UmbContextDiscriminator; + #discriminator?: UmbContextDiscriminator; /** * Creates an instance of UmbContextConsumer. @@ -36,13 +34,12 @@ export class UmbContextConsumer { */ constructor( protected hostElement: EventTarget, - contextAlias: string | UmbContextToken, - callback?: UmbContextCallback, - discriminator?: UmbContextDiscriminator + contextAlias: string | UmbContextToken, + callback?: UmbContextCallback ) { this.#contextAlias = contextAlias.toString(); this.#callback = callback; - this.#discriminator = discriminator; + this.#discriminator = (contextAlias as any).getDiscriminator?.(); } @@ -51,7 +48,7 @@ export class UmbContextConsumer { The reason for such would be to have some who are more specific than others. For example, some might just need the current workspace-context, others might need the closest handling a certain entityType. As I'm writing this is not relevant, but I wanted to keep the idea as we have had some circumstance that might be solved with this approach. */ - protected _onResponse = (instance: T) => { + protected _onResponse = (instance: BaseType) => { if (this.#instance === instance) { return; } @@ -61,11 +58,11 @@ export class UmbContextConsumer { this.setInstance(instance); } } else { - this.setInstance(instance as D); + this.setInstance(instance as DiscriminatedType); } }; - protected setInstance(instance: D) { + protected setInstance(instance: DiscriminatedType) { this.#instance = instance; this.#callback?.(instance); if (instance !== undefined) { @@ -77,7 +74,7 @@ export class UmbContextConsumer { public asPromise() { return ( this.#promise ?? - (this.#promise = new Promise((resolve) => { + (this.#promise = new Promise((resolve) => { this.#instance ? resolve(this.#instance) : (this.#promiseResolver = resolve); })) ); diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts index 7ad36b1b4e..826d1ca066 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts @@ -1,4 +1,9 @@ -export class UmbContextToken { + +export type UmbContextDiscriminator = (instance: BaseType) => instance is DiscriminatorResult; + +export class UmbContextToken { + + #discriminator: UmbContextDiscriminator | undefined; /** * Get the type of the token * @@ -8,15 +13,18 @@ export class UmbContextToken { * @example `typeof MyToken.TYPE` * @returns undefined */ - readonly TYPE: T = undefined as never; + readonly TYPE: DiscriminatedType = undefined as never; /** - * @param alias Unique identifier for the token, - * @param _desc Description for the token, - * used only for debugging purposes, - * it should but does not need to be unique + * @param alias Unique identifier for the token */ - constructor(protected alias: string, protected _desc?: string) {} + constructor(protected alias: string, discriminator?: UmbContextDiscriminator) { + this.#discriminator = discriminator; + } + + getDiscriminator(): UmbContextDiscriminator | undefined { + return this.#discriminator; + } /** * This method must always return the unique alias of the token since that @@ -27,4 +35,6 @@ export class UmbContextToken { toString(): string { return this.alias; } + + } From c5e5911faf307c605177531ca0e8a97bba65b7c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 23 Aug 2023 21:40:15 +0200 Subject: [PATCH 05/75] main type dance, still 6 minor things to correct. --- .../src/libs/class-api/class.interface.ts | 8 +++--- .../src/libs/class-api/class.mixin.ts | 16 ++++++------ .../consume/context-consumer.controller.ts | 9 +++++-- .../context-api/consume/context-consumer.ts | 25 +++++++++++-------- .../consume/context-request.event.ts | 12 ++++----- .../provide/context-provider.controller.ts | 8 ++++-- .../context-api/provide/context-provider.ts | 4 +-- .../libs/context-api/token/context-token.ts | 6 ++--- .../src/libs/element-api/element.mixin.ts | 16 ++++++------ .../workspace/data-type-workspace.context.ts | 6 +++++ ...ata-type-details-workspace-view.element.ts | 8 +++--- .../src/shared/auth/auth.token.ts | 3 +-- 12 files changed, 68 insertions(+), 53 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.interface.ts b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.interface.ts index b7f7cc9dcd..9e5de261c0 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.interface.ts @@ -16,8 +16,8 @@ export interface UmbClassMixinInterface extends UmbControllerHost, UmbController unique?: string ): UmbObserverController; provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController; - consumeContext( - alias: string | UmbContextToken, - callback: UmbContextCallback - ): UmbContextConsumerController; + consumeContext( + alias: string | UmbContextToken, + callback: UmbContextCallback + ): UmbContextConsumerController; } diff --git a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts index 8d8364766d..b870354492 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts @@ -28,10 +28,10 @@ declare class UmbClassMixinDeclaration implements UmbClassMixinInterface { controllerAlias?: UmbControllerAlias ): UmbObserverController; provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController; - consumeContext( - alias: string | UmbContextToken, - callback: UmbContextCallback - ): UmbContextConsumerController; + consumeContext( + alias: string | UmbContextToken, + callback: UmbContextCallback + ): UmbContextConsumerController; hasController(controller: UmbController): boolean; getControllers(filterMethod: (ctrl: UmbController) => boolean): UmbController[]; addController(controller: UmbController): void; @@ -96,10 +96,10 @@ export const UmbClassMixin = (superClass: T) => { * @return {UmbContextConsumerController} Reference to a Context Consumer Controller instance * @memberof UmbElementMixin */ - consumeContext( - contextAlias: string | UmbContextToken, - callback: UmbContextCallback - ): UmbContextConsumerController { + consumeContext( + contextAlias: string | UmbContextToken, + callback: UmbContextCallback + ): UmbContextConsumerController { return new UmbContextConsumerController(this, contextAlias, callback); } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts index 69d9737250..2194903148 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts @@ -3,7 +3,12 @@ import { UmbContextConsumer } from './context-consumer.js'; import { UmbContextCallback } from './context-request.event.js'; import type { UmbControllerHost, UmbController } from '@umbraco-cms/backoffice/controller-api'; -export class UmbContextConsumerController extends UmbContextConsumer implements UmbController { + +export class UmbContextConsumerController< + BaseType = unknown, + DiscriminatedType extends BaseType = never, + ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType +> extends UmbContextConsumer implements UmbController { #controllerAlias = Symbol(); #host: UmbControllerHost; @@ -11,7 +16,7 @@ export class UmbContextConsumerController extends UmbContextConsume return this.#controllerAlias; } - constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, callback: UmbContextCallback) { + constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, callback: UmbContextCallback) { super(host.getHostElement(), contextAlias, callback); this.#host = host; host.addController(this); diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts index f671be1a38..b50fe5ecfe 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts @@ -11,12 +11,15 @@ import { UmbContextRequestEventImplementation, UmbContextCallback } from './cont * @export * @class UmbContextConsumer */ -export class UmbContextConsumer { - #callback?: UmbContextCallback; - #promise?: Promise; - #promiseResolver?: (instance: DiscriminatedType) => void; +export class UmbContextConsumer< +BaseType = unknown, +DiscriminatedType extends BaseType = never, +ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType> { + #callback?: UmbContextCallback; + #promise?: Promise; + #promiseResolver?: (instance: ResultType) => void; - #instance?: DiscriminatedType; + #instance?: ResultType; get instance() { return this.#instance; } @@ -34,8 +37,8 @@ export class UmbContextConsumer, - callback?: UmbContextCallback + contextAlias: string | UmbContextToken, + callback?: UmbContextCallback ) { this.#contextAlias = contextAlias.toString(); this.#callback = callback; @@ -55,14 +58,14 @@ export class UmbContextConsumer((resolve) => { + (this.#promise = new Promise((resolve) => { this.#instance ? resolve(this.#instance) : (this.#promiseResolver = resolve); })) ); diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.ts index 25b473e58c..afd0e772bc 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.ts @@ -9,9 +9,9 @@ export type UmbContextCallback = (instance: T) => void; * @export * @interface UmbContextRequestEvent */ -export interface UmbContextRequestEvent extends Event { - readonly contextAlias: string | UmbContextToken; - readonly callback: UmbContextCallback; +export interface UmbContextRequestEvent extends Event { + readonly contextAlias: string | UmbContextToken; + readonly callback: UmbContextCallback; } /** @@ -20,10 +20,10 @@ export interface UmbContextRequestEvent extends Event { * @extends {Event} * @implements {UmbContextRequestEvent} */ -export class UmbContextRequestEventImplementation extends Event implements UmbContextRequestEvent { +export class UmbContextRequestEventImplementation extends Event implements UmbContextRequestEvent { public constructor( - public readonly contextAlias: string | UmbContextToken, - public readonly callback: UmbContextCallback + public readonly contextAlias: string | UmbContextToken, + public readonly callback: UmbContextCallback ) { super(umbContextRequestEventType, { bubbles: true, composed: true, cancelable: true }); } diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts index f3db2560b3..6734d971e6 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts @@ -2,14 +2,18 @@ import { UmbContextToken } from '../token/context-token.js'; import { UmbContextProvider } from './context-provider.js'; import type { UmbControllerHost, UmbController } from '@umbraco-cms/backoffice/controller-api'; -export class UmbContextProviderController extends UmbContextProvider implements UmbController { +export class UmbContextProviderController< + BaseType = unknown, + DiscriminatorType extends BaseType = never, + ResultType extends BaseType = keyof DiscriminatorType extends BaseType ? DiscriminatorType : BaseType +> extends UmbContextProvider implements UmbController { #host: UmbControllerHost; public get controllerAlias() { return this._contextAlias.toString(); } - constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, instance: T) { + constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, instance: ResultType) { super(host.getHostElement(), contextAlias, instance); this.#host = host; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts index 90418bcab7..162a9cdd99 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts @@ -13,7 +13,7 @@ import { * @export * @class UmbContextProvider */ -export class UmbContextProvider { +export class UmbContextProvider { protected hostElement: EventTarget; protected _contextAlias: string; @@ -35,7 +35,7 @@ export class UmbContextProvider { * @param {*} instance * @memberof UmbContextProvider */ - constructor(hostElement: EventTarget, contextAlias: string | UmbContextToken, instance: unknown) { + constructor(hostElement: EventTarget, contextAlias: string | UmbContextToken, instance: ResultType) { this.hostElement = hostElement; this._contextAlias = contextAlias.toString(); this.#instance = instance; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts index 826d1ca066..e90e74cd72 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts @@ -1,7 +1,7 @@ -export type UmbContextDiscriminator = (instance: BaseType) => instance is DiscriminatorResult; +export type UmbContextDiscriminator = (instance: BaseType) => instance is DiscriminatorResult; -export class UmbContextToken { +export class UmbContextToken { #discriminator: UmbContextDiscriminator | undefined; /** @@ -13,7 +13,7 @@ export class UmbContextToken; provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController; - consumeContext( - alias: string | UmbContextToken, - callback: UmbContextCallback - ): UmbContextConsumerController; + consumeContext( + alias: string | UmbContextToken, + callback: UmbContextCallback + ): UmbContextConsumerController; } export const UmbElementMixin = (superClass: T) => { @@ -64,10 +64,10 @@ export const UmbElementMixin = (superClass: T) * @return {UmbContextConsumerController} Reference to a Context Consumer Controller instance * @memberof UmbElementMixin */ - consumeContext( - alias: string | UmbContextToken, - callback: UmbContextCallback - ): UmbContextConsumerController { + consumeContext( + alias: string | UmbContextToken, + callback: UmbContextCallback + ): UmbContextConsumerController { return new UmbContextConsumerController(this, alias, callback); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index 4c2e250cb5..4019f99469 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -3,6 +3,7 @@ import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbrac import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbDataTypeWorkspaceContext extends UmbWorkspaceContext @@ -95,3 +96,8 @@ export class UmbDataTypeWorkspaceContext this.#data.complete(); } } + +export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbDataTypeWorkspaceContext => context.getEntityType?.() === 'data-type' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts index d8ef6db802..f08a2a72d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts @@ -1,7 +1,6 @@ -import { UmbDataTypeWorkspaceContext } from '../../data-type-workspace.context.js'; +import { UMB_DATA_TYPE_WORKSPACE_CONTEXT, UmbDataTypeWorkspaceContext } from '../../data-type-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN, @@ -47,9 +46,8 @@ export class UmbDataTypeDetailsWorkspaceViewEditElement this._modalContext = instance; }); - // TODO: Figure out if this is the best way to consume a context or if it could be strongly typed using UmbContextToken - this.consumeContext(UMB_WORKSPACE_CONTEXT, (_instance) => { - this._workspaceContext = _instance as UmbDataTypeWorkspaceContext; + this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (_instance) => { + this._workspaceContext = _instance; this._observeDataType(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.token.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.token.ts index 36a5862575..831ead587c 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.token.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.token.ts @@ -2,6 +2,5 @@ import { IUmbAuth } from './auth.interface.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export const UMB_AUTH = new UmbContextToken( - 'UmbAuth', - 'An instance of UmbAuthFlow that should be shared across the app.' + 'UmbAuth' ); From bb708d737a7b0b4e867e6d89e01acc4b75a1e1d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:07:13 +0200 Subject: [PATCH 06/75] temp commit, before test removing DicriminatorType --- .../src/libs/class-api/class.mixin.ts | 24 ++++++++++++++----- .../provide/context-provider.controller.ts | 9 +++---- .../context-api/provide/context-provider.ts | 4 ++-- .../libs/context-api/token/context-token.ts | 5 +++- .../src/libs/element-api/element.mixin.ts | 15 ++++++++++-- 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts index b870354492..90e8615139 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts @@ -27,7 +27,12 @@ declare class UmbClassMixinDeclaration implements UmbClassMixinInterface { callback: (_value: T) => void, controllerAlias?: UmbControllerAlias ): UmbObserverController; - provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController; + provideContext< + BaseType = unknown, + DiscriminatedType extends BaseType = never, + ResultType extends BaseType = BaseType, + InstanceType extends ResultType = ResultType + >(alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController; consumeContext( alias: string | UmbContextToken, callback: UmbContextCallback @@ -82,11 +87,18 @@ export const UmbClassMixin = (superClass: T) => { * @return {UmbContextProviderController} Reference to a Context Provider Controller instance * @memberof UmbElementMixin */ - provideContext( - contextAlias: string | UmbContextToken, - instance: R - ): UmbContextProviderController { - return new UmbContextProviderController(this, contextAlias, instance); + provideContext + < + BaseType = unknown, + DiscriminatedType extends BaseType = never, + ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType, + InstanceType extends ResultType = ResultType + > + ( + contextAlias: string | UmbContextToken, + instance: InstanceType + ): UmbContextProviderController { + return new UmbContextProviderController(this, contextAlias, instance); } /** diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts index 6734d971e6..655a32f3ae 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts @@ -4,16 +4,17 @@ import type { UmbControllerHost, UmbController } from '@umbraco-cms/backoffice/c export class UmbContextProviderController< BaseType = unknown, - DiscriminatorType extends BaseType = never, - ResultType extends BaseType = keyof DiscriminatorType extends BaseType ? DiscriminatorType : BaseType -> extends UmbContextProvider implements UmbController { + DiscriminatedType extends BaseType = never, + ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType, + InstanceType extends ResultType = ResultType +> extends UmbContextProvider implements UmbController { #host: UmbControllerHost; public get controllerAlias() { return this._contextAlias.toString(); } - constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, instance: ResultType) { + constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, instance: InstanceType) { super(host.getHostElement(), contextAlias, instance); this.#host = host; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts index 162a9cdd99..b95b1058f6 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts @@ -13,7 +13,7 @@ import { * @export * @class UmbContextProvider */ -export class UmbContextProvider { +export class UmbContextProvider { protected hostElement: EventTarget; protected _contextAlias: string; @@ -35,7 +35,7 @@ export class UmbContextProvider, instance: ResultType) { + constructor(hostElement: EventTarget, contextAlias: string | UmbContextToken, instance: ResultType) { this.hostElement = hostElement; this._contextAlias = contextAlias.toString(); this.#instance = instance; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts index e90e74cd72..4a6962d744 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts @@ -1,7 +1,10 @@ export type UmbContextDiscriminator = (instance: BaseType) => instance is DiscriminatorResult; -export class UmbContextToken { +export class UmbContextToken< +BaseType = unknown, +DiscriminatedType extends BaseType = never, +ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType> { #discriminator: UmbContextDiscriminator | undefined; /** diff --git a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts index d22356efed..faa2591ce2 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts @@ -24,7 +24,12 @@ export declare class UmbElement extends UmbControllerHostElement { callback: ObserverCallback, unique?: string ): UmbObserverController; - provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController; + provideContext< + BaseType = unknown, + DiscriminatedType extends BaseType = never, + ResultType extends BaseType = BaseType, + InstanceType extends ResultType = ResultType + >(alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController; consumeContext( alias: string | UmbContextToken, callback: UmbContextCallback @@ -53,7 +58,13 @@ export const UmbElementMixin = (superClass: T) * @return {UmbContextProviderController} Reference to a Context Provider Controller instance * @memberof UmbElementMixin */ - provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController { + provideContext< + BaseType = unknown, + DiscriminatedType extends BaseType = never, + ResultType extends BaseType = BaseType, + InstanceType extends ResultType = ResultType + > + (alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController { return new UmbContextProviderController(this, alias, instance); } From 6dcdb8523e5fb5eafb969759ca665935a7adb679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:18:29 +0200 Subject: [PATCH 07/75] one less generic type to parse around --- .../src/libs/class-api/class.interface.ts | 6 ++--- .../src/libs/class-api/class.mixin.ts | 22 +++++++++---------- .../consume/context-consumer.controller.ts | 7 +++--- .../context-api/consume/context-consumer.ts | 7 +++--- .../consume/context-request.event.ts | 4 ++-- .../provide/context-provider.controller.ts | 7 +++--- .../context-api/provide/context-provider.ts | 4 ++-- .../libs/context-api/token/context-token.ts | 9 ++++---- .../src/libs/element-api/element.mixin.ts | 18 +++++++-------- 9 files changed, 38 insertions(+), 46 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.interface.ts b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.interface.ts index 9e5de261c0..3b64fbea4a 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.interface.ts @@ -16,8 +16,8 @@ export interface UmbClassMixinInterface extends UmbControllerHost, UmbController unique?: string ): UmbObserverController; provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController; - consumeContext( - alias: string | UmbContextToken, + consumeContext( + alias: string | UmbContextToken, callback: UmbContextCallback - ): UmbContextConsumerController; + ): UmbContextConsumerController; } diff --git a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts index 90e8615139..992bdc968d 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts @@ -29,14 +29,13 @@ declare class UmbClassMixinDeclaration implements UmbClassMixinInterface { ): UmbObserverController; provideContext< BaseType = unknown, - DiscriminatedType extends BaseType = never, ResultType extends BaseType = BaseType, InstanceType extends ResultType = ResultType - >(alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController; - consumeContext( - alias: string | UmbContextToken, + >(alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController; + consumeContext( + alias: string | UmbContextToken, callback: UmbContextCallback - ): UmbContextConsumerController; + ): UmbContextConsumerController; hasController(controller: UmbController): boolean; getControllers(filterMethod: (ctrl: UmbController) => boolean): UmbController[]; addController(controller: UmbController): void; @@ -90,15 +89,14 @@ export const UmbClassMixin = (superClass: T) => { provideContext < BaseType = unknown, - DiscriminatedType extends BaseType = never, - ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType, + ResultType extends BaseType = BaseType, InstanceType extends ResultType = ResultType > ( - contextAlias: string | UmbContextToken, + contextAlias: string | UmbContextToken, instance: InstanceType ): UmbContextProviderController { - return new UmbContextProviderController(this, contextAlias, instance); + return new UmbContextProviderController(this, contextAlias, instance); } /** @@ -108,10 +106,10 @@ export const UmbClassMixin = (superClass: T) => { * @return {UmbContextConsumerController} Reference to a Context Consumer Controller instance * @memberof UmbElementMixin */ - consumeContext( - contextAlias: string | UmbContextToken, + consumeContext( + contextAlias: string | UmbContextToken, callback: UmbContextCallback - ): UmbContextConsumerController { + ): UmbContextConsumerController { return new UmbContextConsumerController(this, contextAlias, callback); } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts index 2194903148..4a37a0a406 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts @@ -6,9 +6,8 @@ import type { UmbControllerHost, UmbController } from '@umbraco-cms/backoffice/c export class UmbContextConsumerController< BaseType = unknown, - DiscriminatedType extends BaseType = never, - ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType -> extends UmbContextConsumer implements UmbController { + ResultType extends BaseType = BaseType +> extends UmbContextConsumer implements UmbController { #controllerAlias = Symbol(); #host: UmbControllerHost; @@ -16,7 +15,7 @@ export class UmbContextConsumerController< return this.#controllerAlias; } - constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, callback: UmbContextCallback) { + constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, callback: UmbContextCallback) { super(host.getHostElement(), contextAlias, callback); this.#host = host; host.addController(this); diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts index b50fe5ecfe..31f75bea1f 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts @@ -13,8 +13,7 @@ import { UmbContextRequestEventImplementation, UmbContextCallback } from './cont */ export class UmbContextConsumer< BaseType = unknown, -DiscriminatedType extends BaseType = never, -ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType> { +ResultType extends BaseType = BaseType> { #callback?: UmbContextCallback; #promise?: Promise; #promiseResolver?: (instance: ResultType) => void; @@ -26,7 +25,7 @@ ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? Discrim #contextAlias: string; - #discriminator?: UmbContextDiscriminator; + #discriminator?: UmbContextDiscriminator; /** * Creates an instance of UmbContextConsumer. @@ -37,7 +36,7 @@ ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? Discrim */ constructor( protected hostElement: EventTarget, - contextAlias: string | UmbContextToken, + contextAlias: string | UmbContextToken, callback?: UmbContextCallback ) { this.#contextAlias = contextAlias.toString(); diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.ts index afd0e772bc..444a788353 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.ts @@ -10,7 +10,7 @@ export type UmbContextCallback = (instance: T) => void; * @interface UmbContextRequestEvent */ export interface UmbContextRequestEvent extends Event { - readonly contextAlias: string | UmbContextToken; + readonly contextAlias: string | UmbContextToken; readonly callback: UmbContextCallback; } @@ -22,7 +22,7 @@ export interface UmbContextRequestEvent extends Event { */ export class UmbContextRequestEventImplementation extends Event implements UmbContextRequestEvent { public constructor( - public readonly contextAlias: string | UmbContextToken, + public readonly contextAlias: string | UmbContextToken, public readonly callback: UmbContextCallback ) { super(umbContextRequestEventType, { bubbles: true, composed: true, cancelable: true }); diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts index 655a32f3ae..9eb834bd44 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts @@ -4,17 +4,16 @@ import type { UmbControllerHost, UmbController } from '@umbraco-cms/backoffice/c export class UmbContextProviderController< BaseType = unknown, - DiscriminatedType extends BaseType = never, - ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? DiscriminatedType : BaseType, + ResultType extends BaseType = BaseType, InstanceType extends ResultType = ResultType -> extends UmbContextProvider implements UmbController { +> extends UmbContextProvider implements UmbController { #host: UmbControllerHost; public get controllerAlias() { return this._contextAlias.toString(); } - constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, instance: InstanceType) { + constructor(host: UmbControllerHost, contextAlias: string | UmbContextToken, instance: InstanceType) { super(host.getHostElement(), contextAlias, instance); this.#host = host; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts index b95b1058f6..e506a5e46f 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts @@ -13,7 +13,7 @@ import { * @export * @class UmbContextProvider */ -export class UmbContextProvider { +export class UmbContextProvider { protected hostElement: EventTarget; protected _contextAlias: string; @@ -35,7 +35,7 @@ export class UmbContextProvider, instance: ResultType) { + constructor(hostElement: EventTarget, contextAlias: string | UmbContextToken, instance: ResultType) { this.hostElement = hostElement; this._contextAlias = contextAlias.toString(); this.#instance = instance; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts index 4a6962d744..0ec2b31786 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/token/context-token.ts @@ -3,10 +3,9 @@ export type UmbContextDiscriminator { +ResultType extends BaseType = BaseType> { - #discriminator: UmbContextDiscriminator | undefined; + #discriminator: UmbContextDiscriminator | undefined; /** * Get the type of the token * @@ -21,11 +20,11 @@ ResultType extends BaseType = keyof DiscriminatedType extends BaseType ? Discrim /** * @param alias Unique identifier for the token */ - constructor(protected alias: string, discriminator?: UmbContextDiscriminator) { + constructor(protected alias: string, discriminator?: UmbContextDiscriminator) { this.#discriminator = discriminator; } - getDiscriminator(): UmbContextDiscriminator | undefined { + getDiscriminator(): UmbContextDiscriminator | undefined { return this.#discriminator; } diff --git a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts index faa2591ce2..3c8934cb41 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts @@ -26,14 +26,13 @@ export declare class UmbElement extends UmbControllerHostElement { ): UmbObserverController; provideContext< BaseType = unknown, - DiscriminatedType extends BaseType = never, ResultType extends BaseType = BaseType, InstanceType extends ResultType = ResultType - >(alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController; - consumeContext( - alias: string | UmbContextToken, + >(alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController; + consumeContext( + alias: string | UmbContextToken, callback: UmbContextCallback - ): UmbContextConsumerController; + ): UmbContextConsumerController; } export const UmbElementMixin = (superClass: T) => { @@ -60,11 +59,10 @@ export const UmbElementMixin = (superClass: T) */ provideContext< BaseType = unknown, - DiscriminatedType extends BaseType = never, ResultType extends BaseType = BaseType, InstanceType extends ResultType = ResultType > - (alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController { + (alias: string | UmbContextToken, instance: InstanceType): UmbContextProviderController { return new UmbContextProviderController(this, alias, instance); } @@ -75,10 +73,10 @@ export const UmbElementMixin = (superClass: T) * @return {UmbContextConsumerController} Reference to a Context Consumer Controller instance * @memberof UmbElementMixin */ - consumeContext( - alias: string | UmbContextToken, + consumeContext( + alias: string | UmbContextToken, callback: UmbContextCallback - ): UmbContextConsumerController { + ): UmbContextConsumerController { return new UmbContextConsumerController(this, alias, callback); } } From f666a0d1e90222877a293dfeee42de4b29f266f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:22:39 +0200 Subject: [PATCH 08/75] implement UMB_DATA_TYPE_WORKSPACE_CONTEXT --- .../workspace/data-type-workspace-editor.element.ts | 12 ++++++------ .../data-type-details-workspace-view.element.ts | 4 ++-- .../info/workspace-view-data-type-info.element.ts | 10 ++++------ 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts index 2df92c319c..c78e61f20b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts @@ -1,28 +1,28 @@ -import { UmbDataTypeWorkspaceContext } from './data-type-workspace.context.js'; +import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from './data-type-workspace.context.js'; import { UUIInputElement, UUIInputEvent, UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; /** * @element umb-data-type-workspace-editor * @description - Element for displaying the Data Type Workspace edit route. */ @customElement('umb-data-type-workspace-editor') export class UmbDataTypeWorkspaceEditorElement extends UmbLitElement { - @property() + + @property({attribute: false}) manifest?: ManifestWorkspace; @state() private _dataTypeName = ''; - #workspaceContext?: UmbDataTypeWorkspaceContext; + #workspaceContext?: typeof UMB_DATA_TYPE_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this.#workspaceContext = workspaceContext as UmbDataTypeWorkspaceContext; + this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#workspaceContext = workspaceContext; this.#observeIsNew(); this.#observeName(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts index f08a2a72d1..3b6543ae28 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts @@ -1,4 +1,4 @@ -import { UMB_DATA_TYPE_WORKSPACE_CONTEXT, UmbDataTypeWorkspaceContext } from '../../data-type-workspace.context.js'; +import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from '../../data-type-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { @@ -36,7 +36,7 @@ export class UmbDataTypeDetailsWorkspaceViewEditElement @state() private _data: Array = []; - private _workspaceContext?: UmbDataTypeWorkspaceContext; + private _workspaceContext?: typeof UMB_DATA_TYPE_WORKSPACE_CONTEXT.TYPE; private _modalContext?: UmbModalManagerContext; constructor() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts index 82df25cb71..9a4cf225e6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts @@ -1,7 +1,6 @@ -import { UmbDataTypeWorkspaceContext } from '../../data-type-workspace.context.js'; +import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from '../../data-type-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extension-registry'; @@ -14,14 +13,13 @@ export class UmbWorkspaceViewDataTypeInfoElement @state() _dataType?: DataTypeResponseModel; - private _workspaceContext?: UmbDataTypeWorkspaceContext; + private _workspaceContext?: typeof UMB_DATA_TYPE_WORKSPACE_CONTEXT.TYPE; constructor() { 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, (dataTypeContext) => { - this._workspaceContext = dataTypeContext as UmbDataTypeWorkspaceContext; + this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (dataTypeContext) => { + this._workspaceContext = dataTypeContext; this._observeDataType(); }); } From b2a8f516669a6fdbf70113cf985f49f458a8aa7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:24:41 +0200 Subject: [PATCH 09/75] user workspace context token --- .../actions/workspace-action-user-group-save.element.ts | 9 ++++----- .../actions/user-workspace-action-save.element.ts | 9 ++++----- .../users/users/workspace/user-workspace.context.ts | 7 ++++++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/actions/workspace-action-user-group-save.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/actions/workspace-action-user-group-save.element.ts index 6dcb3840f1..82e73a3bfd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/actions/workspace-action-user-group-save.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/actions/workspace-action-user-group-save.element.ts @@ -1,21 +1,20 @@ -import { UmbUserWorkspaceContext } from '../../../users/workspace/user-workspace.context.js'; +import { UMB_USER_WORKSPACE_CONTEXT } from '../../../users/workspace/user-workspace.context.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-workspace-action-user-group-save') export class UmbWorkspaceActionUserGroupSaveElement extends UmbLitElement { @state() private _saveButtonState?: UUIButtonState; - private _workspaceContext?: UmbUserWorkspaceContext; + private _workspaceContext?: typeof UMB_USER_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this._workspaceContext = instance as UmbUserWorkspaceContext; + this.consumeContext(UMB_USER_WORKSPACE_CONTEXT, (instance) => { + this._workspaceContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/actions/user-workspace-action-save.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/actions/user-workspace-action-save.element.ts index cb2668d241..3f13e9538a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/actions/user-workspace-action-save.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/actions/user-workspace-action-save.element.ts @@ -1,21 +1,20 @@ -import { UmbUserWorkspaceContext } from '../user-workspace.context.js'; +import { UMB_USER_WORKSPACE_CONTEXT } from '../user-workspace.context.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-user-workspace-action-save') export class UmbUserWorkspaceActionSaveElement extends UmbLitElement { @state() private _saveButtonState?: UUIButtonState; - private _workspaceContext?: UmbUserWorkspaceContext; + private _workspaceContext?: typeof UMB_USER_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this._workspaceContext = instance as UmbUserWorkspaceContext; + this.consumeContext(UMB_USER_WORKSPACE_CONTEXT, (instance) => { + this._workspaceContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts index 7a5c8bea0c..b9c4567217 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts @@ -4,7 +4,7 @@ import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbrac import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import type { UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; +import { UmbContextConsumerController, UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UMB_AUTH } from '@umbraco-cms/backoffice/auth'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; @@ -81,3 +81,8 @@ export class UmbUserWorkspaceContext this.#data.complete(); } } + +export const UMB_USER_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbUserWorkspaceContext => context.getEntityType?.() === 'user' +); From 20178cc87203b19110af718904e8a6b527cd6a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:26:13 +0200 Subject: [PATCH 10/75] stylesheet --- .../workspace/stylesheet-workspace.context.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 1aebd6378e..fd1ba1098a 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 @@ -1,10 +1,11 @@ import { UmbStylesheetRepository } from '../repository/stylesheet.repository.js'; import { StylesheetDetails } from '../index.js'; -import { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext { +export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -40,3 +41,8 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext( + 'UmbWorkspaceContext', + (context): context is UmbStylesheetWorkspaceContext => context.getEntityType?.() === 'stylesheet' +); From 5a4cde21cfd4e0fac0963775fa4c905155ca6ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:27:30 +0200 Subject: [PATCH 11/75] media --- .../media/workspace/media-workspace-editor.element.ts | 9 ++++----- .../media/media/workspace/media-workspace.context.ts | 6 ++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace-editor.element.ts index bd019acd8a..a73f300ae3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace-editor.element.ts @@ -1,20 +1,19 @@ -import { UmbMediaWorkspaceContext } from './media-workspace.context.js'; +import { UMB_MEDIA_WORKSPACE_CONTEXT } from './media-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-media-workspace-editor') export class UmbMediaWorkspaceEditorElement extends UmbLitElement { @state() _id?: string; - #umbWorkspaceContext?: UmbMediaWorkspaceContext; + #umbWorkspaceContext?: typeof UMB_MEDIA_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#umbWorkspaceContext = instance as UmbMediaWorkspaceContext; + this.consumeContext(UMB_MEDIA_WORKSPACE_CONTEXT, (instance) => { + this.#umbWorkspaceContext = instance; this.#observeId(); }); } 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 6385dabbf3..be6dc2a30c 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 @@ -3,6 +3,7 @@ import type { MediaDetails } from '../index.js'; import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MediaDetails; export class UmbMediaWorkspaceContext @@ -81,3 +82,8 @@ export class UmbMediaWorkspaceContext this.#data.complete(); } } + +export const UMB_MEDIA_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbMediaWorkspaceContext => context.getEntityType?.() === 'media' +); From 94808de8d55de7ab13cc20751929ebc7a8034f0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:28:05 +0200 Subject: [PATCH 12/75] member --- .../members/members/workspace/member-workspace.context.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts index 05ff73ad53..20aecf8e28 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts @@ -2,6 +2,7 @@ import { UmbMemberRepository } from '../repository/member.repository.js'; import type { MemberDetails } from '../types.js'; import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbMemberWorkspaceContext extends UmbWorkspaceContext @@ -35,3 +36,8 @@ export class UmbMemberWorkspaceContext console.log('destroy'); } } + +export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === 'member' +); From 794fd7fecee8402a038a1e833f0b57f75052475b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:43:04 +0200 Subject: [PATCH 13/75] document --- .../property-type-based-property.element.ts | 9 ++++----- .../workspace/workspace-context/workspace-context.ts | 10 +++++----- .../workspace-variant/workspace-variant.context.ts | 3 +-- .../workspace/document-workspace-editor.element.ts | 10 +++++----- .../document-workspace-split-view.element.ts | 10 +++++----- .../documents/workspace/document-workspace.context.ts | 9 +++++++++ .../packages/documents/documents/workspace/index.ts | 2 +- ...document-workspace-view-edit-properties.element.ts | 7 +++---- .../edit/document-workspace-view-edit-tab.element.ts | 7 +++---- .../edit/document-workspace-view-edit.element.ts | 11 +++++------ 10 files changed, 41 insertions(+), 37 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts index 22a215fda2..30ed7b8c57 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts @@ -2,12 +2,11 @@ import { UmbDataTypeConfig } from '../../property-editor/index.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbDataTypeRepository } from '@umbraco-cms/backoffice/data-type'; -import { UmbDocumentWorkspaceContext } from '@umbraco-cms/backoffice/document'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { DataTypeResponseModel, PropertyTypeModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-property-type-based-property') export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { @@ -57,12 +56,12 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { } private _propertyVariantId?: UmbVariantId | undefined; - private _workspaceContext?: UmbDocumentWorkspaceContext; + private _workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this._workspaceContext = workspaceContext as UmbDocumentWorkspaceContext; + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (workspaceContext) => { + this._workspaceContext = workspaceContext; this._observeProperty(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts index 216bcd0a25..9a332bf0e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts @@ -1,6 +1,5 @@ import { UmbEntityWorkspaceContextInterface } from './workspace-entity-context.interface.js'; -import { UmbContextConsumerController, UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @@ -12,6 +11,7 @@ TODO: We need to figure out if we like to keep using same alias for all workspac If so we need to align on a interface that all of these implements. otherwise consumers cant trust the workspace-context. */ export abstract class UmbWorkspaceContext + extends UmbBaseController implements UmbEntityWorkspaceContextInterface { public readonly host: UmbControllerHostElement; @@ -25,11 +25,12 @@ export abstract class UmbWorkspaceContext { + this.provideContext(UMB_WORKSPACE_CONTEXT, this); + this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (context) => { (this.modalContext as UmbModalContext) = context; }); } @@ -59,5 +60,4 @@ export abstract class UmbWorkspaceContext; - abstract destroy(): void; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts index ae547cca51..723ef79d03 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts @@ -1,4 +1,3 @@ -import { UmbDocumentWorkspaceContext } from '../../../documents/documents/workspace/document-workspace.context.js'; import { UmbWorkspaceVariableEntityContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { @@ -47,7 +46,7 @@ export class UmbWorkspaceVariantContext { // How do we ensure this connects to a document workspace context? and not just any other context? (We could start providing workspace contexts twice, under the general name and under a specific name) // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken new UmbContextConsumerController(host, UMB_WORKSPACE_CONTEXT, (context) => { - this.#workspaceContext = context as UmbDocumentWorkspaceContext; + this.#workspaceContext = context as UmbWorkspaceVariableEntityContextInterface; this._observeVariant(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts index bbc79d3022..03a0a78f2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts @@ -1,11 +1,11 @@ import { UmbDocumentWorkspaceSplitViewElement } from './document-workspace-split-view.element.js'; -import { UmbDocumentWorkspaceContext } from './document-workspace.context.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from './document-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { customElement, state, css, html } from '@umbraco-cms/backoffice/external/lit'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; import { VariantModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT, ActiveVariant } from '@umbraco-cms/backoffice/workspace'; +import { ActiveVariant } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-workspace-editor') export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { @@ -21,13 +21,13 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { @state() _workspaceSplitViews: Array = []; - #workspaceContext?: UmbDocumentWorkspaceContext; + #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbDocumentWorkspaceContext; + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; this.#observeVariants(); this.#observeSplitViews(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts index 2e9969575a..3b53f112e6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts @@ -1,11 +1,11 @@ -import { UmbDocumentWorkspaceContext } from './document-workspace.context.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from './document-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { ActiveVariant, UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { ActiveVariant } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-workspace-split-view') export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { - private _workspaceContext?: UmbDocumentWorkspaceContext; + private _workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; @state() _unique?: string; @@ -16,8 +16,8 @@ export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (context) => { - this._workspaceContext = context as UmbDocumentWorkspaceContext; + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => { + this._workspaceContext = context; this._observeActiveVariantInfo(); }); } 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 b2dae9cbe6..f893bbc8e9 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 @@ -3,6 +3,7 @@ import { UmbDocumentTypeRepository } from '../../document-types/repository/docum import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import { + UmbEntityWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceSplitViewManager, UmbWorkspaceVariableEntityContextInterface, @@ -15,6 +16,7 @@ import { UmbObserverController, } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; // TODO: should this context be called DocumentDraft instead of workspace? or should the draft be part of this? // TODO: Should we have a DocumentStructureContext and maybe even a DocumentDraftContext? @@ -200,7 +202,14 @@ export class UmbDocumentWorkspaceContext public destroy(): void { this.#draft.complete(); this.structure.destroy(); + super.destroy(); } } export default UmbDocumentWorkspaceContext; + + +export const UMB_DOCUMENT_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbDocumentWorkspaceContext => context.getEntityType?.() === 'document' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/index.ts index 2571e17006..e9022a2bcb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/index.ts @@ -1 +1 @@ -export { UmbDocumentWorkspaceContext } from './document-workspace.context.js'; +export * from './document-workspace.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts index f10b171c2c..86779efde4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts @@ -1,10 +1,9 @@ -import { UmbDocumentWorkspaceContext } from '../../document-workspace.context.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../document-workspace.context.js'; import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { UmbContentTypePropertyStructureHelper, PropertyContainerTypes } from '@umbraco-cms/backoffice/content-type'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { PropertyTypeModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-document-workspace-view-edit-properties') export class UmbDocumentWorkspaceViewEditPropertiesElement extends UmbLitElement { @property({ type: String, attribute: 'container-name', reflect: false }) @@ -31,8 +30,8 @@ export class UmbDocumentWorkspaceViewEditPropertiesElement extends UmbLitElement constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this._propertyStructureHelper.setStructureManager((workspaceContext as UmbDocumentWorkspaceContext).structure); + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (workspaceContext) => { + this._propertyStructureHelper.setStructureManager(workspaceContext.structure); }); this.observe(this._propertyStructureHelper.propertyStructure, (propertyStructure) => { this._propertyStructure = propertyStructure; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts index edd197e53c..d20ab42f14 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts @@ -1,10 +1,9 @@ -import { UmbDocumentWorkspaceContext } from '../../document-workspace.context.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../document-workspace.context.js'; import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { PropertyTypeContainerModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import './document-workspace-view-edit-properties.element.js'; @customElement('umb-document-workspace-view-edit-tab') @@ -53,8 +52,8 @@ export class UmbDocumentWorkspaceViewEditTabElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this._groupStructureHelper.setStructureManager((workspaceContext as UmbDocumentWorkspaceContext).structure); + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (workspaceContext) => { + this._groupStructureHelper.setStructureManager(workspaceContext.structure); }); this.observe(this._groupStructureHelper.containers, (groups) => { this._groups = groups; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts index 5f3d398cc3..7ff9ef424c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts @@ -1,4 +1,4 @@ -import { UmbDocumentWorkspaceContext } from '../../document-workspace.context.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../document-workspace.context.js'; import type { UmbDocumentWorkspaceViewEditTabElement } from './document-workspace-view-edit-tab.element.js'; import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; @@ -11,7 +11,6 @@ import { } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { PropertyTypeContainerModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-document-workspace-view-edit') @@ -34,7 +33,7 @@ export class UmbDocumentWorkspaceViewEditElement @state() private _activePath = ''; - private _workspaceContext?: UmbDocumentWorkspaceContext; + private _workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; private _tabsStructureHelper = new UmbContentTypeContainerStructureHelper(this); @@ -50,9 +49,9 @@ export class UmbDocumentWorkspaceViewEditElement // _hasRootProperties can be gotten via _tabsStructureHelper.hasProperties. But we do not support root properties currently. - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this._workspaceContext = workspaceContext as UmbDocumentWorkspaceContext; - this._tabsStructureHelper.setStructureManager((workspaceContext as UmbDocumentWorkspaceContext).structure); + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (workspaceContext) => { + this._workspaceContext = workspaceContext; + this._tabsStructureHelper.setStructureManager(workspaceContext.structure); this._observeRootGroups(); }); } From 8080930f0c92fd34dfff99b62c1f1b984406f712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:45:20 +0200 Subject: [PATCH 14/75] language --- .../language/language-workspace-editor.element.ts | 9 ++++----- .../workspace/language/language-workspace.context.ts | 7 +++++++ .../details/language-details-workspace-view.element.ts | 10 ++++------ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace-editor.element.ts index 302bb99f90..81d95a8b76 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace-editor.element.ts @@ -1,12 +1,11 @@ -import { UmbLanguageWorkspaceContext } from './language-workspace.context.js'; +import { UMB_LANGUAGE_WORKSPACE_CONTEXT } from './language-workspace.context.js'; import { UUITextStyles, UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-language-workspace-editor') export class UmbLanguageWorkspaceEditorElement extends UmbLitElement { - #workspaceContext?: UmbLanguageWorkspaceContext; + #workspaceContext?: typeof UMB_LANGUAGE_WORKSPACE_CONTEXT.TYPE; @state() _language?: LanguageResponseModel; @@ -17,8 +16,8 @@ export class UmbLanguageWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (context) => { - this.#workspaceContext = context as UmbLanguageWorkspaceContext; + this.consumeContext(UMB_LANGUAGE_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context; this.#observeData(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts index 06c3895234..18061c36a1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts @@ -3,6 +3,7 @@ import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbrac import { ApiError, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbLanguageWorkspaceContext extends UmbWorkspaceContext @@ -100,3 +101,9 @@ export class UmbLanguageWorkspaceContext this.#data.complete(); } } + + +export const UMB_LANGUAGE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbLanguageWorkspaceContext => context.getEntityType?.() === 'document' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts index 39e7490849..c9237b6767 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts @@ -1,13 +1,11 @@ -import { UmbLanguageWorkspaceContext } from '../../language-workspace.context.js'; +import { UMB_LANGUAGE_WORKSPACE_CONTEXT } from '../../language-workspace.context.js'; import type { UmbInputCultureSelectElement } from '../../../../../cultures/components/input-culture-select/input-culture-select.element.js'; import type { UmbInputLanguagePickerElement } from '../../../../components/input-language-picker/input-language-picker.element.js'; import { UUIBooleanInputEvent, UUIToggleElement, UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -// TODO: set up import alias for these modules import { UmbChangeEvent } from '@umbraco-cms/backoffice/events'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-language-details-workspace-view') @@ -27,7 +25,7 @@ export class UmbLanguageDetailsWorkspaceViewElement @state() _validationErrors?: { [key: string]: Array }; - #languageWorkspaceContext?: UmbLanguageWorkspaceContext; + #languageWorkspaceContext?: typeof UMB_LANGUAGE_WORKSPACE_CONTEXT.TYPE; constructor() { super(); @@ -36,8 +34,8 @@ export class UmbLanguageDetailsWorkspaceViewElement In the language workspace we want to clear a default language change warning and reset the initial state after a save action has been executed. */ let initialStateSet = false; - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#languageWorkspaceContext = instance as UmbLanguageWorkspaceContext; + this.consumeContext(UMB_LANGUAGE_WORKSPACE_CONTEXT, (instance) => { + this.#languageWorkspaceContext = instance; this.observe(this.#languageWorkspaceContext.data, (language) => { this._language = language; From 910ef2a2e9a7f4fb29dfa4c03d633f48e9db1735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:48:29 +0200 Subject: [PATCH 15/75] template --- .../language/language-workspace.context.ts | 2 +- .../workspace/template-workspace-editor.element.ts | 9 ++++----- .../workspace/template-workspace.context.ts | 13 +++++++++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts index 18061c36a1..1b8609c9b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts @@ -105,5 +105,5 @@ export class UmbLanguageWorkspaceContext export const UMB_LANGUAGE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', - (context): context is UmbLanguageWorkspaceContext => context.getEntityType?.() === 'document' + (context): context is UmbLanguageWorkspaceContext => context.getEntityType?.() === 'language' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts index d42558c8f8..e205153628 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts @@ -2,7 +2,7 @@ import type { UmbTemplatingInsertMenuElement } from '../../components/insert-men import { UMB_MODAL_TEMPLATING_INSERT_SECTION_MODAL } from '../../modals/insert-section-modal/insert-section-modal.element.js'; import { UMB_TEMPLATE_QUERY_BUILDER_MODAL } from '../modals/modal-tokens.js'; import { getQuerySnippet } from '../../utils.js'; -import type { UmbTemplateWorkspaceContext } from './template-workspace.context.js'; +import { UMB_TEMPLATE_WORKSPACE_CONTEXT } from './template-workspace.context.js'; import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { camelCase } from '@umbraco-cms/backoffice/external/lodash'; import { UUITextStyles, UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; @@ -14,7 +14,6 @@ import { } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { Subject, debounceTime } from '@umbraco-cms/backoffice/external/rxjs'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-template-workspace-editor') export class UmbTemplateWorkspaceEditorElement extends UmbLitElement { @@ -36,7 +35,7 @@ export class UmbTemplateWorkspaceEditorElement extends UmbLitElement { @query('umb-code-editor') private _codeEditor?: UmbCodeEditorElement; - #templateWorkspaceContext?: UmbTemplateWorkspaceContext; + #templateWorkspaceContext?: typeof UMB_TEMPLATE_WORKSPACE_CONTEXT.TYPE; #isNew = false; #masterTemplateId: string | null = null; @@ -50,8 +49,8 @@ export class UmbTemplateWorkspaceEditorElement extends UmbLitElement { this._modalContext = instance; }); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this.#templateWorkspaceContext = workspaceContext as UmbTemplateWorkspaceContext; + this.consumeContext(UMB_TEMPLATE_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#templateWorkspaceContext = workspaceContext; this.observe(this.#templateWorkspaceContext.name, (name) => { this._name = name; }); 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 7c0d3b12b4..eb16956d22 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 @@ -1,6 +1,6 @@ import { UmbTemplateRepository } from '../repository/template.repository.js'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; -import { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { createObservablePart, UmbBooleanState, @@ -9,8 +9,9 @@ import { } from '@umbraco-cms/backoffice/observable-api'; import type { TemplateItemResponseModel, TemplateResponseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext { +export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { #data = new UmbDeepState(undefined); data = this.#data.asObservable(); #masterTemplate = new UmbObjectState(null); @@ -163,5 +164,13 @@ ${currentContent}`; public destroy() { this.#data.complete(); + super.destroy(); } } + + + +export const UMB_TEMPLATE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbTemplateWorkspaceContext => context.getEntityType?.() === 'template' +); From d1637f0a6b690e8c306ff02b29f64b017191a1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:50:00 +0200 Subject: [PATCH 16/75] media-type --- .../workspace/media-type-workspace-editor.element.ts | 9 ++++----- .../workspace/media-type-workspace.context.ts | 9 ++++++++- .../workspace/media-type-workspace.element.ts | 4 ++-- 3 files changed, 14 insertions(+), 8 deletions(-) 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 ef0a7d0cef..66ccbc9080 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,19 +1,18 @@ -import { UmbWorkspaceMediaTypeContext } from './media-type-workspace.context.js'; +import { UMB_MEDIA_TYPE_WORKSPACE_CONTEXT } from './media-type-workspace.context.js'; import { UUITextStyles, UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-media-type-workspace-editor') export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { @state() private _mediaTypeName?: string | null = ''; - #workspaceContext?: UmbWorkspaceMediaTypeContext; + #workspaceContext?: typeof UMB_MEDIA_TYPE_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbWorkspaceMediaTypeContext; + this.consumeContext(UMB_MEDIA_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; this.#observeName(); }); } 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 7094e6321e..af3dc52196 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,9 +3,10 @@ import type { MediaTypeDetails } from '../types.js'; import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MediaTypeDetails; -export class UmbWorkspaceMediaTypeContext +export class UmbMediaTypeWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { @@ -61,3 +62,9 @@ export class UmbWorkspaceMediaTypeContext this.#data.complete(); } } + + +export const UMB_MEDIA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbMediaTypeWorkspaceContext => context.getEntityType?.() === 'media-type' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.element.ts index e52824cf62..f7526539cf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.element.ts @@ -1,4 +1,4 @@ -import { UmbWorkspaceMediaTypeContext } from './media-type-workspace.context.js'; +import { UmbMediaTypeWorkspaceContext } from './media-type-workspace.context.js'; import { UmbMediaTypeWorkspaceEditorElement } from './media-type-workspace-editor.element.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; @@ -7,7 +7,7 @@ import type { UmbRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-media-type-workspace') export class UmbMediaTypeWorkspaceElement extends UmbLitElement { - #workspaceContext = new UmbWorkspaceMediaTypeContext(this); + #workspaceContext = new UmbMediaTypeWorkspaceContext(this); #element = new UmbMediaTypeWorkspaceEditorElement(); @state() From 920398a7b0a9da8de8585e2154fa87305db58467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:51:04 +0200 Subject: [PATCH 17/75] user group --- .../workspace/user-group-workspace-editor.element.ts | 9 ++++----- .../workspace/user-group-workspace.context.ts | 7 +++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace-editor.element.ts index f31fdc2cb4..ff25993a7d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace-editor.element.ts @@ -1,11 +1,10 @@ -import { UmbUserGroupWorkspaceContext } from './user-group-workspace.context.js'; +import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from './user-group-workspace.context.js'; import { UUIInputElement, UUIInputEvent, UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; // TODO: import from package when available //import { UmbUserInputElement } from '../../users/components/user-input/user-input.element.js'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_CONFIRM_MODAL, @@ -21,14 +20,14 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { @state() private _userKeys?: Array; - #workspaceContext?: UmbUserGroupWorkspaceContext; + #workspaceContext?: typeof UMB_USER_GROUP_WORKSPACE_CONTEXT.TYPE; #modalContext?: UmbModalManagerContext; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbUserGroupWorkspaceContext; + this.consumeContext(UMB_USER_GROUP_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; this.observe(this.#workspaceContext.data, (userGroup) => (this._userGroup = userGroup)); this.observe(this.#workspaceContext.userIds, (userKeys) => (this._userKeys = userKeys)); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts index 22c49bbfc8..b9ce1e2fe3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts @@ -4,6 +4,7 @@ import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbrac import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbUserGroupWorkspaceContext extends UmbWorkspaceContext @@ -102,3 +103,9 @@ export class UmbUserGroupWorkspaceContext this.#userIds.next(keys); } } + + +export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbUserGroupWorkspaceContext => context.getEntityType?.() === 'user-group' +); From c0585635c32d9fdf758676ced824d8bb3dba7c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:52:43 +0200 Subject: [PATCH 18/75] dictionary --- .../workspace/dictionary-workspace-editor.element.ts | 9 ++++----- .../dictionary/workspace/dictionary-workspace.context.ts | 7 +++++++ .../editor/workspace-view-dictionary-editor.element.ts | 9 ++++----- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace-editor.element.ts index 782c224aec..7da4156282 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace-editor.element.ts @@ -1,20 +1,19 @@ -import { UmbDictionaryWorkspaceContext } from './dictionary-workspace.context.js'; import { UUIInputElement, UUIInputEvent, UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UMB_DICTIONARY_WORKSPACE_CONTEXT } from './dictionary-workspace.context'; @customElement('umb-dictionary-workspace-editor') export class UmbDictionaryWorkspaceEditorElement extends UmbLitElement { @state() private _name?: string | null = ''; - #workspaceContext?: UmbDictionaryWorkspaceContext; + #workspaceContext?: typeof UMB_DICTIONARY_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbDictionaryWorkspaceContext; + this.consumeContext(UMB_DICTIONARY_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; this.#observeName(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts index 70981cb8d3..65a134993d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts @@ -3,6 +3,7 @@ import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbrac import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { DictionaryItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbDictionaryWorkspaceContext extends UmbWorkspaceContext @@ -83,3 +84,9 @@ export class UmbDictionaryWorkspaceContext this.#data.complete(); } } + + +export const UMB_DICTIONARY_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbDictionaryWorkspaceContext => context.getEntityType?.() === 'dictionary-item' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/views/editor/workspace-view-dictionary-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/views/editor/workspace-view-dictionary-editor.element.ts index d099923ff7..c8a800a7be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/views/editor/workspace-view-dictionary-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/views/editor/workspace-view-dictionary-editor.element.ts @@ -1,10 +1,9 @@ -import { UmbDictionaryWorkspaceContext } from '../../dictionary-workspace.context.js'; +import { UMB_DICTIONARY_WORKSPACE_CONTEXT } from '../../dictionary-workspace.context.js'; import { UmbDictionaryRepository } from '../../../repository/dictionary.repository.js'; import { UUITextStyles, UUITextareaElement, UUITextareaEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DictionaryItemResponseModel, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-workspace-view-dictionary-editor') export class UmbWorkspaceViewDictionaryEditorElement extends UmbLitElement { @state() @@ -15,7 +14,7 @@ export class UmbWorkspaceViewDictionaryEditorElement extends UmbLitElement { @state() private _languages: Array = []; - #workspaceContext!: UmbDictionaryWorkspaceContext; + #workspaceContext!: typeof UMB_DICTIONARY_WORKSPACE_CONTEXT.TYPE; async connectedCallback() { super.connectedCallback(); @@ -23,8 +22,8 @@ export class UmbWorkspaceViewDictionaryEditorElement extends UmbLitElement { this.#repo = new UmbDictionaryRepository(this); this._languages = await this.#repo.getLanguages(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (_instance) => { - this.#workspaceContext = _instance as UmbDictionaryWorkspaceContext; + this.consumeContext(UMB_DICTIONARY_WORKSPACE_CONTEXT, (_instance) => { + this.#workspaceContext = _instance; this.#observeDictionary(); }); } From c7a82584c7e17afd414eb134efe69192a5496a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:53:35 +0200 Subject: [PATCH 19/75] member type --- .../member-types/workspace/member-type-workspace.context.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts index 0f23872a49..89d557f61c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts @@ -2,6 +2,7 @@ import { UmbMemberTypeRepository } from '../repository/member-type.repository.js import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; // TODO => use correct tpye type EntityType = any; @@ -73,3 +74,8 @@ export class UmbMemberTypeWorkspaceContext this.#data.complete(); } } + +export const UMB_MEMBER_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbMemberTypeWorkspaceContext => context.getEntityType?.() === 'member-type' +); From 7f09bf53bdacf4a0a695c2c441433c64b065caf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:56:07 +0200 Subject: [PATCH 20/75] member group --- .../member-group-workspace-editor.element.ts | 9 ++++----- .../workspace/member-group-workspace.context.ts | 10 +++++++++- .../workspace/member-group-workspace.element.ts | 4 ++-- .../workspace-view-member-group-info.element.ts | 15 +++++---------- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace-editor.element.ts index 68326fa8ab..76bd4ad7ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace-editor.element.ts @@ -1,16 +1,15 @@ import type { MemberGroupDetails } from '../types.js'; -import { UmbWorkspaceMemberGroupContext } from './member-group-workspace.context.js'; +import { UMB_MEMBER_TYPE_WORKSPACE_CONTEXT } from './member-group-workspace.context.js'; import { UUITextStyles, UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; /** * @element umb-member-group-edit-workspace * @description - Element for displaying a Member Group Workspace */ @customElement('umb-member-group-workspace-editor') export class UmbMemberGroupWorkspaceEditorElement extends UmbLitElement { - #workspaceContext?: UmbWorkspaceMemberGroupContext; + #workspaceContext?: typeof UMB_MEMBER_TYPE_WORKSPACE_CONTEXT.TYPE; @state() private _memberGroup?: MemberGroupDetails; @@ -18,8 +17,8 @@ export class UmbMemberGroupWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbWorkspaceMemberGroupContext; + this.consumeContext(UMB_MEMBER_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; this.#observeMemberGroup(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts index e62fd10d22..a098cf5302 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts @@ -3,9 +3,10 @@ import type { MemberGroupDetails } from '../types.js'; import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MemberGroupDetails; -export class UmbWorkspaceMemberGroupContext +export class UmbMemberGroupWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { @@ -63,3 +64,10 @@ export class UmbWorkspaceMemberGroupContext this.#data.complete(); } } + + + +export const UMB_MEMBER_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbMemberGroupWorkspaceContext => context.getEntityType?.() === 'member-group' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.element.ts index a3f7dd6275..a7b397d6b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.element.ts @@ -1,4 +1,4 @@ -import { UmbWorkspaceMemberGroupContext } from './member-group-workspace.context.js'; +import { UmbMemberGroupWorkspaceContext } from './member-group-workspace.context.js'; import { UmbMemberGroupWorkspaceEditorElement } from './member-group-workspace-editor.element.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; @@ -11,7 +11,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; */ @customElement('umb-member-group-workspace') export class UmbMemberGroupWorkspaceElement extends UmbLitElement { - #workspaceContext = new UmbWorkspaceMemberGroupContext(this); + #workspaceContext = new UmbMemberGroupWorkspaceContext(this); #element = new UmbMemberGroupWorkspaceEditorElement(); @state() diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts index 668e27a38b..5eb6ebdf7c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts @@ -1,22 +1,20 @@ -import { UmbWorkspaceMemberGroupContext } from '../../member-group-workspace.context.js'; +import { UMB_MEMBER_TYPE_WORKSPACE_CONTEXT } from '../../member-group-workspace.context.js'; import type { MemberGroupDetails } from '../../../types.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-workspace-view-member-group-info') export class UmbWorkspaceViewMemberGroupInfoElement extends UmbLitElement { @state() private _memberGroup?: MemberGroupDetails; - #workspaceContext?: UmbWorkspaceMemberGroupContext; + #workspaceContext?: typeof UMB_MEMBER_TYPE_WORKSPACE_CONTEXT.TYPE; constructor() { 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, (instance) => { - this.#workspaceContext = instance as UmbWorkspaceMemberGroupContext; + this.consumeContext(UMB_MEMBER_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; this.#observeMemberGroup(); }); } @@ -26,10 +24,7 @@ export class UmbWorkspaceViewMemberGroupInfoElement extends UmbLitElement { this.observe(this.#workspaceContext.data, (memberGroup) => { if (!memberGroup) return; - - // TODO: handle if model is not of the type wanted. - // TODO: Make method to identify wether data is of type MemberGroupDetails - this._memberGroup = memberGroup as MemberGroupDetails; + this._memberGroup = memberGroup; }); } From e33bc0eab3f8061dead0854fd8f07e542b247553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:57:30 +0200 Subject: [PATCH 21/75] correct member group token --- .../workspace/member-group-workspace-editor.element.ts | 6 +++--- .../workspace/member-group-workspace.context.ts | 2 +- .../views/info/workspace-view-member-group-info.element.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace-editor.element.ts index 76bd4ad7ff..f179034f91 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace-editor.element.ts @@ -1,5 +1,5 @@ import type { MemberGroupDetails } from '../types.js'; -import { UMB_MEMBER_TYPE_WORKSPACE_CONTEXT } from './member-group-workspace.context.js'; +import { UMB_MEMBER_GROUP_WORKSPACE_CONTEXT } from './member-group-workspace.context.js'; import { UUITextStyles, UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -9,7 +9,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; */ @customElement('umb-member-group-workspace-editor') export class UmbMemberGroupWorkspaceEditorElement extends UmbLitElement { - #workspaceContext?: typeof UMB_MEMBER_TYPE_WORKSPACE_CONTEXT.TYPE; + #workspaceContext?: typeof UMB_MEMBER_GROUP_WORKSPACE_CONTEXT.TYPE; @state() private _memberGroup?: MemberGroupDetails; @@ -17,7 +17,7 @@ export class UmbMemberGroupWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MEMBER_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.consumeContext(UMB_MEMBER_GROUP_WORKSPACE_CONTEXT, (instance) => { this.#workspaceContext = instance; this.#observeMemberGroup(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts index a098cf5302..3de2301159 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts @@ -67,7 +67,7 @@ export class UmbMemberGroupWorkspaceContext -export const UMB_MEMBER_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEMBER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMemberGroupWorkspaceContext => context.getEntityType?.() === 'member-group' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts index 5eb6ebdf7c..f0ecd0c4c7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts @@ -1,4 +1,4 @@ -import { UMB_MEMBER_TYPE_WORKSPACE_CONTEXT } from '../../member-group-workspace.context.js'; +import { UMB_MEMBER_GROUP_WORKSPACE_CONTEXT } from '../../member-group-workspace.context.js'; import type { MemberGroupDetails } from '../../../types.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; @@ -8,12 +8,12 @@ export class UmbWorkspaceViewMemberGroupInfoElement extends UmbLitElement { @state() private _memberGroup?: MemberGroupDetails; - #workspaceContext?: typeof UMB_MEMBER_TYPE_WORKSPACE_CONTEXT.TYPE; + #workspaceContext?: typeof UMB_MEMBER_GROUP_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_MEMBER_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.consumeContext(UMB_MEMBER_GROUP_WORKSPACE_CONTEXT, (instance) => { this.#workspaceContext = instance; this.#observeMemberGroup(); }); From 0662ce2f36d25640bfdc690f4632c33f6e29c9d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 10:58:50 +0200 Subject: [PATCH 22/75] relation type --- .../workspace/relation-type-workspace-editor.element.ts | 9 ++++----- .../workspace/relation-type-workspace.context.ts | 8 ++++++++ ...relation-type-workspace-view-relation-type.element.ts | 9 ++++----- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace-editor.element.ts index a5c702b781..c240f5074e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace-editor.element.ts @@ -1,16 +1,15 @@ -import { UmbRelationTypeWorkspaceContext } from './relation-type-workspace.context.js'; +import { UMB_RELATION_TYPE_WORKSPACE_CONTEXT } from './relation-type-workspace.context.js'; import { UUIInputElement, UUIInputEvent, UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; /** * @element umb-relation-type-workspace-editor * @description - Element for displaying a Relation Type Workspace */ @customElement('umb-relation-type-workspace-editor') export class UmbRelationTypeWorkspaceEditorElement extends UmbLitElement { - #workspaceContext?: UmbRelationTypeWorkspaceContext; + #workspaceContext?: typeof UMB_RELATION_TYPE_WORKSPACE_CONTEXT.TYPE; @state() private _relationType?: RelationTypeResponseModel; @@ -18,8 +17,8 @@ export class UmbRelationTypeWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbRelationTypeWorkspaceContext; + this.consumeContext(UMB_RELATION_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; this.#observeRelationType(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts index e4ca17e164..d8e9eb97d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -3,6 +3,7 @@ import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbrac import type { RelationTypeBaseModel, RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbRelationTypeWorkspaceContext extends UmbWorkspaceContext @@ -75,3 +76,10 @@ export class UmbRelationTypeWorkspaceContext this.#data.complete(); } } + + + +export const UMB_RELATION_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbRelationTypeWorkspaceContext => context.getEntityType?.() === 'relation-type' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts index 38a5646f66..2cbde2b269 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts @@ -1,4 +1,4 @@ -import { UmbRelationTypeWorkspaceContext } from '../../relation-type-workspace.context.js'; +import { UMB_RELATION_TYPE_WORKSPACE_CONTEXT } from '../../relation-type-workspace.context.js'; import { UUITextStyles, UUIBooleanInputEvent, @@ -9,7 +9,6 @@ import { import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-relation-type-workspace-view-relation-type') @@ -20,13 +19,13 @@ export class UmbRelationTypeWorkspaceViewRelationTypeElement @state() private _relationType?: RelationTypeResponseModel; - #workspaceContext?: UmbRelationTypeWorkspaceContext; + #workspaceContext?: typeof UMB_RELATION_TYPE_WORKSPACE_CONTEXT.TYPE; constructor() { super(); - this.consumeContext(UMB_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbRelationTypeWorkspaceContext; + this.consumeContext(UMB_RELATION_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; this._observeRelationType(); }); } From 4f886c461e4cb7df3fb7a165c8c0df713d540e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 11:12:25 +0200 Subject: [PATCH 23/75] partial views --- .../partial-views/workspace/manifests.ts | 2 +- ...=> partial-view-workspace-edit.element.ts} | 34 ++++++++----------- ...t.ts => partial-view-workspace.context.ts} | 23 ++++++++----- ...t.ts => partial-view-workspace.element.ts} | 22 ++++++------ 4 files changed, 41 insertions(+), 40 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/{partial-views-workspace-edit.element.ts => partial-view-workspace-edit.element.ts} (79%) rename src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/{partial-views-workspace.context.ts => partial-view-workspace.context.ts} (80%) rename src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/{partial-views-workspace.element.ts => partial-view-workspace.element.ts} (66%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/manifests.ts index 7fb04dcb3a..aa37da276e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/manifests.ts @@ -5,7 +5,7 @@ const workspace: ManifestWorkspace = { type: 'workspace', alias: 'Umb.Workspace.PartialView', name: 'Partial View Workspace', - loader: () => import('./partial-views-workspace.element.js'), + loader: () => import('./partial-view-workspace.element.js'), meta: { entityType: 'partial-view', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-edit.element.ts similarity index 79% rename from src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace-edit.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-edit.element.ts index f376caaa93..9f22cb074d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-edit.element.ts @@ -1,17 +1,16 @@ import { UmbTemplatingInsertMenuElement } from '../../components/index.js'; import { UMB_TEMPLATE_QUERY_BUILDER_MODAL } from '../../templates/modals/modal-tokens.js'; import { getQuerySnippet } from '../../utils.js'; -import { UmbPartialViewsWorkspaceContext } from './partial-views-workspace.context.js'; +import { UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT } from './partial-view-workspace.context.js'; import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { UUITextStyles, UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, query, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { Subject, debounceTime } from '@umbraco-cms/backoffice/external/rxjs'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; -@customElement('umb-partial-views-workspace-edit') -export class UmbPartialViewsWorkspaceEditElement extends UmbLitElement { +@customElement('umb-partial-view-workspace-edit') +export class UmbPartialViewWorkspaceEditElement extends UmbLitElement { #name: string | undefined = ''; @state() private get _name() { @@ -35,11 +34,9 @@ export class UmbPartialViewsWorkspaceEditElement extends UmbLitElement { @query('umb-code-editor') private _codeEditor?: UmbCodeEditorElement; - #partialViewsWorkspaceContext?: UmbPartialViewsWorkspaceContext; + #partialViewWorkspaceContext?: typeof UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT.TYPE; private _modalContext?: UmbModalManagerContext; - #isNew = false; - private inputQuery$ = new Subject(); constructor() { @@ -49,31 +46,30 @@ export class UmbPartialViewsWorkspaceEditElement extends UmbLitElement { this._modalContext = instance; }); - //tODO: should this be called something else here? - this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this.#partialViewsWorkspaceContext = workspaceContext as UmbPartialViewsWorkspaceContext; - this.observe(this.#partialViewsWorkspaceContext.name, (name) => { + this.consumeContext(UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#partialViewWorkspaceContext = workspaceContext; + this.observe(this.#partialViewWorkspaceContext.name, (name) => { this._name = name; }); - this.observe(this.#partialViewsWorkspaceContext.content, (content) => { + this.observe(this.#partialViewWorkspaceContext.content, (content) => { this._content = content; }); - this.observe(this.#partialViewsWorkspaceContext.path, (path) => { + this.observe(this.#partialViewWorkspaceContext.path, (path) => { this._path = path; }); - this.observe(this.#partialViewsWorkspaceContext.isNew, (isNew) => { + this.observe(this.#partialViewWorkspaceContext.isNew, (isNew) => { this.#isNew = !!isNew; }); - this.observe(this.#partialViewsWorkspaceContext.isCodeEditorReady, (isReady) => { + this.observe(this.#partialViewWorkspaceContext.isCodeEditorReady, (isReady) => { this._ready = isReady; }); this.inputQuery$.pipe(debounceTime(250)).subscribe((nameInputValue: string) => { - this.#partialViewsWorkspaceContext?.setName(`${nameInputValue}.cshtml`); + this.#partialViewWorkspaceContext?.setName(`${nameInputValue}.cshtml`); }); }); } @@ -87,7 +83,7 @@ export class UmbPartialViewsWorkspaceEditElement extends UmbLitElement { #onCodeEditorInput(event: Event) { const target = event.target as UmbCodeEditorElement; const value = target.code as string; - this.#partialViewsWorkspaceContext?.setContent(value); + this.#partialViewWorkspaceContext?.setContent(value); } #insertSnippet(event: Event) { @@ -206,10 +202,10 @@ export class UmbPartialViewsWorkspaceEditElement extends UmbLitElement { ]; } -export default UmbPartialViewsWorkspaceEditElement; +export default UmbPartialViewWorkspaceEditElement; declare global { interface HTMLElementTagNameMap { - 'umb-partial-views-workspace-edit': UmbPartialViewsWorkspaceEditElement; + 'umb-partial-view-workspace-edit': UmbPartialViewWorkspaceEditElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts similarity index 80% rename from src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts index a464109ebe..dca98153e4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts @@ -2,20 +2,20 @@ import { UmbPartialViewsRepository } from '../repository/partial-views.repositor import { PartialViewDetails } from '../config.js'; import { createObservablePart, UmbBooleanState, UmbDeepState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { UpdatePartialViewRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -// TODO: I think this should be named PartialViewWorkspace... not with an 's' -export class UmbPartialViewsWorkspaceContext extends UmbWorkspaceContext< +export class UmbPartialViewWorkspaceContext extends UmbWorkspaceContext< UmbPartialViewsRepository, PartialViewDetails -> { +> implements UmbEntityWorkspaceContextInterface { getEntityId(): string | undefined { return this.getData()?.path; } getEntityType(): string { - throw new Error('Method not implemented.'); + return 'partial-view'; } save(): Promise { const partialView = this.getData(); @@ -42,9 +42,7 @@ export class UmbPartialViewsWorkspaceContext extends UmbWorkspaceContext< this.repository.save(partialView.path, updateRequestBody); return Promise.resolve(); } - destroy(): void { - throw new Error('Method not implemented.'); - } + #data = new UmbDeepState(undefined); data = this.#data.asObservable(); name = createObservablePart(this.#data, (data) => data?.name); @@ -55,7 +53,7 @@ export class UmbPartialViewsWorkspaceContext extends UmbWorkspaceContext< isCodeEditorReady = this.#isCodeEditorReady.asObservable(); constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Workspace.PartialViews', new UmbPartialViewsRepository(host)); + super(host, 'Umb.Workspace.PartialView', new UmbPartialViewsRepository(host)); this.#loadCodeEditor(); } @@ -100,3 +98,10 @@ export class UmbPartialViewsWorkspaceContext extends UmbWorkspaceContext< this.#data.next(newPartial); } } + + + +export const UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbPartialViewWorkspaceContext => context.getEntityType?.() === 'partial-view' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.element.ts similarity index 66% rename from src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.element.ts index fd4e506f4b..68ffef8742 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-views-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.element.ts @@ -1,19 +1,19 @@ -import { UmbPartialViewsWorkspaceContext } from './partial-views-workspace.context.js'; +import { UmbPartialViewWorkspaceContext } from './partial-view-workspace.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbRoute, IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router'; -import './partial-views-workspace-edit.element.js'; +import './partial-view-workspace-edit.element.js'; import '../../components/insert-menu/templating-insert-menu.element.js'; import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; -@customElement('umb-partial-views-workspace') -export class UmbPartialViewsWorkspaceElement extends UmbLitElement { - #partialViewsWorkspaceContext = new UmbPartialViewsWorkspaceContext(this); +@customElement('umb-partial-view-workspace') +export class UmbPartialViewWorkspaceElement extends UmbLitElement { + #partialViewWorkspaceContext = new UmbPartialViewWorkspaceContext(this); - #element = document.createElement('umb-partial-views-workspace-edit'); + #element = document.createElement('umb-partial-view-workspace-edit'); @state() _routes: UmbRoute[] = [ @@ -24,11 +24,11 @@ export class UmbPartialViewsWorkspaceElement extends UmbLitElement { const parentKey = info.match.params.parentKey; const decodePath = decodeURIComponent(parentKey); const snippetName = info.match.params.snippetName; - this.#partialViewsWorkspaceContext.create(decodePath === 'null' ? null : parentKey, snippetName); + this.#partialViewWorkspaceContext.create(decodePath === 'null' ? null : parentKey, snippetName); new UmbWorkspaceIsNewRedirectController( this, - this.#partialViewsWorkspaceContext, + this.#partialViewWorkspaceContext, this.shadowRoot!.querySelector('umb-router-slot')! ); }, @@ -39,7 +39,7 @@ export class UmbPartialViewsWorkspaceElement extends UmbLitElement { setup: (component: PageComponent, info: IRoutingInfo) => { const key = info.match.params.key; const decodePath = decodeURIComponent(key).replace('-cshtml', '.cshtml'); - this.#partialViewsWorkspaceContext.load(decodePath); + this.#partialViewWorkspaceContext.load(decodePath); }, }, ]; @@ -51,10 +51,10 @@ export class UmbPartialViewsWorkspaceElement extends UmbLitElement { static styles = [UUITextStyles, css``]; } -export default UmbPartialViewsWorkspaceElement; +export default UmbPartialViewWorkspaceElement; declare global { interface HTMLElementTagNameMap { - 'umb-partial-views-workspace': UmbPartialViewsWorkspaceElement; + 'umb-partial-view-workspace': UmbPartialViewWorkspaceElement; } } From 8094d35cb98757f357190df63378ce60b4dd8b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 11:16:19 +0200 Subject: [PATCH 24/75] document-type --- .../workspace/document-type-workspace.context.ts | 9 +++++++++ 1 file changed, 9 insertions(+) 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 edaee609fa..28582fa254 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 @@ -7,6 +7,7 @@ import type { DocumentTypeResponseModel, } from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = DocumentTypeResponseModel; export class UmbDocumentTypeWorkspaceContext @@ -151,5 +152,13 @@ export class UmbDocumentTypeWorkspaceContext public destroy(): void { this.structure.destroy(); + super.destroy(); } } + + +export const UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + (context): context is UmbDocumentTypeWorkspaceContext => context.getEntityType?.() === 'document-type' +); + From 287de98a2efe57dbc503fe9664ecd281ffd8f397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 11:16:24 +0200 Subject: [PATCH 25/75] remove unused prop --- .../workspace/partial-view-workspace-edit.element.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-edit.element.ts index 9f22cb074d..c5bc85cde3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace-edit.element.ts @@ -60,10 +60,6 @@ export class UmbPartialViewWorkspaceEditElement extends UmbLitElement { this._path = path; }); - this.observe(this.#partialViewWorkspaceContext.isNew, (isNew) => { - this.#isNew = !!isNew; - }); - this.observe(this.#partialViewWorkspaceContext.isCodeEditorReady, (isReady) => { this._ready = isReady; }); From 2e6cd78f33347f10e8807a3727d987ceec34dac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 12:21:45 +0200 Subject: [PATCH 26/75] remove console.log --- .../design/document-type-workspace-view-edit-tab.element.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts index c3315d124d..0523fe1716 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts @@ -19,7 +19,6 @@ export class UmbDocumentTypeWorkspaceViewEditTabElement extends UmbLitElement { } public set ownerTabId(value: string | null | undefined) { if (value === this._ownerTabId) return; - console.log('ownerTabId', value); const oldValue = this._ownerTabId; this._ownerTabId = value; this._groupStructureHelper.setOwnerId(value); From 254921f6cd4368ec4e2c39f53f7dab6ab8177bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 12:58:29 +0200 Subject: [PATCH 27/75] docs --- .../storybook/stories/context-api.mdx | 72 ++++++++++++++++++- .../storybook/stories/umb-controller.mdx | 20 +----- 2 files changed, 72 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx index 8b7b5c8fb5..38226bc235 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx @@ -5,7 +5,7 @@ import { Meta } from '@storybook/blocks'; # Context API The Context API enables connections between Elements and APIs. -DOM structure defines the context of which an API is exposed for. APIs are provided via an element and can then be consumed by any decending element wthin. +DOM structure defines the context of which an API is exposed for. APIs are provided via an element and can then be consumed by any decending element. ### Consume a Context API. @@ -18,7 +18,7 @@ this.consumeContext('requestThisContextAlias', (context) => { }); ``` -Or with a Controller using a 'host' reference to Controller Host(Umbraco Element/Controller): +Or with a Controller using a 'host' reference to Controller Host(Thats either a Umbraco Element or just another Controller): ```ts new UmbContextConsumerController(host, 'requestThisContextAlias', (context) => { @@ -27,6 +27,74 @@ new UmbContextConsumerController(host, 'requestThisContextAlias', (context) => { }); ``` +#### Context Token + +Using a Context Token gives you a typed context: + +```ts +import { UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; + +this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (context) => { + // Notice this is a subscription, as context might change or a new one appears, but the value is strongly typed + console.log("I've got the context of the right type", context); +}); +``` + +#### Write your own Context Token + +A Context Token is generally just a string matched with a type. In this way users of the token can be sure to get the right type of context. + +```ts +import { ContextToken } from '@umbraco-cms/backoffice/context'; + +type MyContext = { + foo: string; + bar: number; +}; + +const MY_CONTEXT_TOKEN = new ContextToken('My.Context.Token'); +``` + +#### Context Token with discriminator. + +Notice this is only relevant if you are going to make multiple context API for the same context. + +In some cases we need to have different APIs for the same context. Our Workspace Contexts is a good example of this. + +If someone wants the workspace name, they might not care about the specific API of the Workspace Context. These implementations can use a standard Context Token with a type of a generic Workspace Context. + +Our Document Workspace Context, has features around Publishing. We do not want a new Context for these features, as we want to make sure when we are in a Workspace, we do not accidentally retrieve workspace context of a parent workspace. So we need to provide a workspace context in each workspace, the one we retrieve is the one we will be using. +But since publishing is not part of the generic Workspace Context, we need to identify if the context is a Document Workspace Context and then recast it. + +To avoid each implementation taking care of this, Context Tokens can be extended with a type discriminator. +This will dicard the given api if it does not live up to the needs, and then it is the decired type, it will cast the api to the desired type. + +This example, shows how to create a discriminator Context Token, that will discard the api if it is not a Publishable Context: + +```ts +import { ContextToken } from '@umbraco-cms/backoffice/context'; + +type MyBaseContext = { + foo: string; + bar: number; +}; + +type MyPublishableContext = { + publish() +}; + +const MY_CONTEXT_TOKEN = new ContextToken('My.Context.Token', (context): context is MyPublishableContext => { + return 'publish' in context; +}); +``` + +This enables implementors to request a Document Workspace Context, without the knowledge about how do identify such, nor needing to know about the Type. + +In details, the Context API will find the first API matching alias 'My.Context.Token', and never look furhter. If that API does live up to the type discriminator, it will be returned. If not the consumer will never reply. + + + + ### Provide a Context API. From a Umbraco Element or Umbraco Controller: diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/umb-controller.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/umb-controller.mdx index 9c919807b1..c0787a2a02 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/umb-controller.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/umb-controller.mdx @@ -15,22 +15,6 @@ provideContext(alias: string | UmbContextToken, instance: R): Um consumeContext(alias: string | UmbContextToken, callback: UmbContextCallback): UmbContextConsumerController ``` -Use these for an smooth consumption, like this request for a Context API using a simple string context, where the callback value is of an unknown type: +Read about the 'observe' method in the [Store-API](?path=/docs/guides-store--docs). -```ts -this.consumeContext('requestThisContextAlias', (context) => { - // Notice this is a subscription, as context might change or a new one appears. - console.log("I've got the context", context); -}); -``` - -Or use the a Context Token to get a typed context: - -```ts -import { UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; - -this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (context) => { - // Notice this is a subscription, as context might change or a new one appears, but the value is strongly typed - console.log("I've got the context", context); -}); -``` +Read about the 'provideContext' and 'consumeContext' methods in the [Context-API](?path=/docs/guides-context-api--docs). From 7acd87cd94cad8c030efd52d00f662f3524666c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 13:19:50 +0200 Subject: [PATCH 28/75] import order --- .../src/packages/core/sorter/sorter.controller.test.ts | 2 +- .../dictionary/workspace/dictionary-workspace-editor.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/sorter/sorter.controller.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/sorter/sorter.controller.test.ts index d7ec58f808..6f14f6afde 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/sorter/sorter.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/sorter/sorter.controller.test.ts @@ -1,8 +1,8 @@ import { expect, fixture, html } from '@open-wc/testing'; import { UmbSorterConfig, UmbSorterController } from './sorter.controller.js'; +import UmbTestSorterControllerElement from './stories/test-sorter-controller.element.js'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { customElement } from '@umbraco-cms/backoffice/external/lit'; -import UmbTestSorterControllerElement from './stories/test-sorter-controller.element.js'; describe('UmbContextConsumer', () => { let hostElement: UmbTestSorterControllerElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace-editor.element.ts index 7da4156282..5e8885353d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace-editor.element.ts @@ -1,7 +1,7 @@ +import { UMB_DICTIONARY_WORKSPACE_CONTEXT } from './dictionary-workspace.context.js'; import { UUIInputElement, UUIInputEvent, UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_DICTIONARY_WORKSPACE_CONTEXT } from './dictionary-workspace.context'; @customElement('umb-dictionary-workspace-editor') export class UmbDictionaryWorkspaceEditorElement extends UmbLitElement { @state() From 05980473aa3fcc3f1e150adf250abcd79c3c4090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 13:43:25 +0200 Subject: [PATCH 29/75] variable name update --- src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx index 38226bc235..c37ce72cfc 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx @@ -83,7 +83,7 @@ type MyPublishableContext = { publish() }; -const MY_CONTEXT_TOKEN = new ContextToken('My.Context.Token', (context): context is MyPublishableContext => { +const MY_PUBLISHABLE_CONTEXT_TOKEN = new ContextToken('My.Context.Token', (context): context is MyPublishableContext => { return 'publish' in context; }); ``` From 4a9930bc87c79af4f13127022368b89ee5afc488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 13:45:13 +0200 Subject: [PATCH 30/75] correct text --- src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx index c37ce72cfc..aef604f5ef 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx @@ -67,7 +67,7 @@ Our Document Workspace Context, has features around Publishing. We do not want a But since publishing is not part of the generic Workspace Context, we need to identify if the context is a Document Workspace Context and then recast it. To avoid each implementation taking care of this, Context Tokens can be extended with a type discriminator. -This will dicard the given api if it does not live up to the needs, and then it is the decired type, it will cast the api to the desired type. +This will dicard the given api if it does not live up to the needs, and when it is the decired type, it will cast the api to the desired type. This example, shows how to create a discriminator Context Token, that will discard the api if it is not a Publishable Context: From 6d8017340d19914fa0eb982f59311c7144f96431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 13:54:38 +0200 Subject: [PATCH 31/75] added implementation example --- .../storybook/stories/context-api.mdx | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx index aef604f5ef..1dfa36306a 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx @@ -71,15 +71,17 @@ This will dicard the given api if it does not live up to the needs, and when it This example, shows how to create a discriminator Context Token, that will discard the api if it is not a Publishable Context: +Context token example: + ```ts import { ContextToken } from '@umbraco-cms/backoffice/context'; -type MyBaseContext = { +interface MyBaseContext { foo: string; bar: number; }; -type MyPublishableContext = { +interface MyPublishableContext extends MyBaseContext { publish() }; @@ -88,13 +90,28 @@ const MY_PUBLISHABLE_CONTEXT_TOKEN = new ContextToken { + // context is of type 'MyPublishableContext' + console.log("I've got the context of the right type", context); +}); + +``` + +This enables implementors to request a publishable context, without the knowledge about how do identify such, neither they need to know about the Type. In details, the Context API will find the first API matching alias 'My.Context.Token', and never look furhter. If that API does live up to the type discriminator, it will be returned. If not the consumer will never reply. - - ### Provide a Context API. From a Umbraco Element or Umbraco Controller: From e56dc01baf46a4fde33cb65014ee720f65ee5724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 24 Aug 2023 14:21:05 +0200 Subject: [PATCH 32/75] minor correction --- .../components/variant-selector/variant-selector.element.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts index 1db3b51bb2..2afeed82b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts @@ -10,9 +10,6 @@ import { DocumentVariantResponseModel, ContentStateModel } from '@umbraco-cms/ba @customElement('umb-variant-selector') export class UmbVariantSelectorElement extends UmbLitElement { - // TODO: not jet used: - @property() - alias!: string; @state() _variants: Array = []; @@ -21,7 +18,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { @state() _activeVariants: Array = []; - @property() + @property({attribute: false}) public get _activeVariantsCultures(): string[] { return this._activeVariants.map((el) => el.culture ?? '') ?? []; } From 727db04b2ef7308320098939c484613aff8b5b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 25 Aug 2023 21:57:38 +0200 Subject: [PATCH 33/75] Mega refactor v.1 --- .../variant-selector.element.ts | 64 ++++----- .../content-type-structure-manager.class.ts | 38 +++++ .../property-editor-ui-block-grid.element.ts | 2 - .../src/packages/core/repositories/index.ts | 1 + .../core/repositories/repository.interface.ts | 12 ++ .../dataset-context.interface.ts | 31 +++++ .../dataset-context/dataset-context.token.ts | 4 + .../core/workspace/dataset-context/index.ts | 4 + .../variant-dataset-context.interface.ts | 10 ++ .../variant-dataset-context.token.ts | 7 + .../src/packages/core/workspace/index.ts | 3 +- .../core/workspace/workspace-context/index.ts | 6 +- ...y-structure-workspace-context.interface.ts | 8 ++ ...publishable-workspace-context.interface.ts | 7 + .../saveable-workspace-context.interface.ts | 7 + .../workspace-context.interface.ts | 24 ++-- .../workspace-context/workspace-context.ts | 6 +- .../workspace-entity-context.interface.ts | 8 -- ...ce-invariable-entity-context.interface.ts} | 8 +- ...space-variable-entity-context.interface.ts | 16 ++- .../workspace-property.context.ts | 12 +- .../core/workspace/workspace-variant/index.ts | 4 +- .../variantable-property.element.ts | 7 +- .../workspace-split-view.context.ts | 119 ++++++++++++++++ ...ent.ts => workspace-split-view.element.ts} | 21 ++- .../workspace-variant.context.ts | 131 ------------------ .../workspace/dictionary-workspace.context.ts | 6 +- .../document-type-workspace.context.ts | 6 +- .../document-dataset-context.ts | 99 +++++++++++++ .../document-workspace-editor.element.ts | 2 + .../document-workspace-split-view.element.ts | 8 +- .../workspace/document-workspace.context.ts | 93 +++++++------ .../workspace/media-type-workspace.context.ts | 6 +- .../workspace/media-workspace.context.ts | 6 +- .../member-group-workspace.context.ts | 6 +- .../member-type-workspace.context.ts | 6 +- .../workspace/member-workspace.context.ts | 6 +- .../workspace/data-type-workspace.context.ts | 6 +- .../language/language-workspace.context.ts | 6 +- .../relation-type-workspace.context.ts | 6 +- .../partial-view-workspace.context.ts | 6 +- .../workspace/stylesheet-workspace.context.ts | 6 +- .../workspace/template-workspace.context.ts | 6 +- .../workspace/user-group-workspace.context.ts | 6 +- .../users/workspace/user-workspace.context.ts | 6 +- 45 files changed, 537 insertions(+), 315 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repositories/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repositories/repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/publishable-workspace-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-entity-context.interface.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/{workspace-invariantable-entity-context.interface.ts => workspace-invariable-entity-context.interface.ts} (54%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/{workspace-variant.element.ts => workspace-split-view.element.ts} (67%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts index 2afeed82b8..673dbcab97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts @@ -1,8 +1,10 @@ +import { UmbVariantId } from '../../variant/variant-id.class.js'; import { UUITextStyles, UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { - UmbWorkspaceVariantContext, - UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, + UmbWorkspaceSplitViewContext, + UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, + UMB_VARIANT_DATASET_CONTEXT, ActiveVariant, } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -23,7 +25,8 @@ export class UmbVariantSelectorElement extends UmbLitElement { return this._activeVariants.map((el) => el.culture ?? '') ?? []; } - private _variantContext?: UmbWorkspaceVariantContext; + #splitViewContext?: UmbWorkspaceSplitViewContext; + #datasetContext?: typeof UMB_VARIANT_DATASET_CONTEXT.TYPE; @state() private _name?: string; @@ -43,18 +46,21 @@ export class UmbVariantSelectorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, (instance) => { - this._variantContext = instance; + this.consumeContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, (instance) => { + this.#splitViewContext = instance; this._observeVariants(); this._observeActiveVariants(); - this._observeVariantContext(); + }); + this.consumeContext(UMB_VARIANT_DATASET_CONTEXT, (instance) => { + this.#datasetContext = instance; + this._observeDatasetContext(); }); } private async _observeVariants() { - if (!this._variantContext) return; + if (!this.#splitViewContext) return; - const workspaceContext = this._variantContext.getWorkspaceContext(); + const workspaceContext = this.#splitViewContext.getWorkspaceContext(); if (workspaceContext) { this.observe( workspaceContext.variants, @@ -69,9 +75,9 @@ export class UmbVariantSelectorElement extends UmbLitElement { } private async _observeActiveVariants() { - if (!this._variantContext) return; + if (!this.#splitViewContext) return; - const workspaceContext = this._variantContext.getWorkspaceContext(); + const workspaceContext = this.#splitViewContext.getWorkspaceContext(); if (workspaceContext) { this.observe( workspaceContext.splitView.activeVariantsInfo, @@ -85,32 +91,21 @@ export class UmbVariantSelectorElement extends UmbLitElement { } } - private async _observeVariantContext() { - if (!this._variantContext) return; + private async _observeDatasetContext() { + if (!this.#datasetContext) return; + + const variantId = this.#datasetContext.getVariantId(); + this._culture = variantId.culture; + this._segment = variantId.segment; + this.updateVariantDisplayName(); this.observe( - this._variantContext.name, + this.#datasetContext.name, (name) => { this._name = name; }, '_name' ); - this.observe( - this._variantContext.culture, - (culture) => { - this._culture = culture; - this.updateVariantDisplayName(); - }, - '_culture' - ); - this.observe( - this._variantContext.segment, - (segment) => { - this._segment = segment; - this.updateVariantDisplayName(); - }, - '_segment' - ); } private updateVariantDisplayName() { @@ -128,8 +123,9 @@ export class UmbVariantSelectorElement extends UmbLitElement { const target = event.composedPath()[0] as UUIInputElement; if (typeof target?.value === 'string') { - // TODO: create a setName method on EntityWorkspace: - this._variantContext?.setName(target.value); + // TODO: Refactor: find a good way to mix these features... maybe we should request the context multiple times? or find a way to mix the discriminators? or a way to investigate the context for features? + alert("cannot set name currently.") + //this.#datasetContext?.setName(target.value); } } } @@ -146,17 +142,17 @@ export class UmbVariantSelectorElement extends UmbLitElement { } private _switchVariant(variant: DocumentVariantResponseModel) { - this._variantContext?.switchVariant(variant); + this.#splitViewContext?.switchVariant(UmbVariantId.Create(variant)); this._close(); } private _openSplitView(variant: DocumentVariantResponseModel) { - this._variantContext?.openSplitView(variant); + this.#splitViewContext?.openSplitView(UmbVariantId.Create(variant)); this._close(); } private _closeSplitView() { - this._variantContext?.closeSplitView(); + this.#splitViewContext?.closeSplitView(); } private _isVariantActive(culture: string) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index 815f59cd12..5256114c33 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -307,6 +307,44 @@ export class UmbContentTypePropertyStructureManager { + for (const docType of docTypes) { + const foundProp = docType.properties?.find((property) => property.id === propertyId); + if(foundProp) { + return foundProp; + } + } + return undefined; + }); + } + + async getPropertyStructureById(propertyId: string) { + await this.#init; + for (const docType of this.#documentTypes.getValue()) { + const foundProp = docType.properties?.find((property) => property.id === propertyId); + if(foundProp) { + return foundProp; + } + } + return undefined; + } + async getPropertyStructureByAlias(propertyAlias: string) { + await this.#init; + for (const docType of this.#documentTypes.getValue()) { + const foundProp = docType.properties?.find((property) => property.alias === propertyAlias); + if(foundProp) { + return foundProp; + } + } + return undefined; + } + + /* rootDocumentTypeName() { return this.#documentTypes.asObservablePart((docTypes) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/block-grid/property-editor-ui-block-grid.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/block-grid/property-editor-ui-block-grid.element.ts index 5f96bcb745..8a5c467731 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/block-grid/property-editor-ui-block-grid.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/block-grid/property-editor-ui-block-grid.element.ts @@ -1,4 +1,3 @@ -import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../../../workspace/workspace-variant/workspace-variant.context.js'; import { UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN } from '../../../workspace/workspace-property/workspace-property.context.js'; import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; @@ -13,7 +12,6 @@ import type { UmbDataTypeConfigCollection } from '@umbraco-cms/backoffice/compon */ @customElement('umb-property-editor-ui-block-grid') export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { - private _variantContext?: typeof UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN.TYPE; @property() value = ''; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repositories/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repositories/index.ts new file mode 100644 index 0000000000..a7d3719d54 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repositories/index.ts @@ -0,0 +1 @@ +export * from './repository.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repositories/repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repositories/repository.interface.ts new file mode 100644 index 0000000000..1ea5957a38 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repositories/repository.interface.ts @@ -0,0 +1,12 @@ +export interface UmbRepository { + + /** + * Get the type of the entity + * + * @public + * @type {EntityType} + * @returns undefined + */ + readonly ENTITY_TYPE: EntityType; + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts new file mode 100644 index 0000000000..d1aeb705e7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts @@ -0,0 +1,31 @@ +import { type Observable } from "@umbraco-cms/backoffice/external/rxjs"; + +/** + * Represents a set of properties. + * This can take form as many, so to list a few: + * - A specific variant of content + * - Content that does not vary + * - A block. + * - A DataType configuration. + * + * The base type of this holds a Name and some Properties. + * Some might be enriches with Variant Info, like culture and segment. + * Others might have saved publishing status. + * Also setting the name is an additional feature. + */ +export interface UmbDatasetContext { + + getType(): string; + getUnique(): string | undefined; + //getUniqueName(): string; + + getName(): string | undefined; + readonly name: Observable; + + destroy(): void; + + // Property methods: + propertyValueByAlias(propertyAlias: string): Promise | undefined>; + setPropertyValue(propertyAlias: string, value: unknown): Promise; + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts new file mode 100644 index 0000000000..50fca8b86b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts @@ -0,0 +1,4 @@ +import { type UmbDatasetContext } from "./dataset-context.interface.js"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; + +export const UMB_DATASET_CONTEXT = new UmbContextToken("UmbEntityContext"); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts new file mode 100644 index 0000000000..a173e9c8ba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts @@ -0,0 +1,4 @@ +export * from './dataset-context.interface.js'; +export * from './dataset-context.token.js'; +export * from './variant-dataset-context.interface.js'; +export * from './variant-dataset-context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts new file mode 100644 index 0000000000..7dcbc04497 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts @@ -0,0 +1,10 @@ +import { type UmbVariantId } from "../../variant/variant-id.class.js"; +import { UmbDatasetContext } from "./dataset-context.interface.js"; +import { type Observable } from "@umbraco-cms/backoffice/external/rxjs"; + + +export interface UmbVariantDatasetContext extends UmbDatasetContext { + + getVariantId(): UmbVariantId; + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts new file mode 100644 index 0000000000..d863de0aff --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts @@ -0,0 +1,7 @@ +import { type UmbDatasetContext } from "./dataset-context.interface.js"; +import { UmbVariantDatasetContext } from "./variant-dataset-context.interface.js"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; + +export const UMB_VARIANT_DATASET_CONTEXT = new UmbContextToken( + "UmbEntityContext", +(context): context is UmbVariantDatasetContext => 'getVariantId' in context); 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 22cd49d585..d25134ee36 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,5 +1,7 @@ +export * from './dataset-context/index.js'; export * from './workspace-action-menu/index.js'; export * from './workspace-action/index.js'; +export * from './workspace-alias.condition.js'; export * from './workspace-context/index.js'; export * from './workspace-editor/index.js'; export * from './workspace-footer/index.js'; @@ -9,4 +11,3 @@ export * from './workspace-property-layout/workspace-property-layout.element.js' export * from './workspace-property/index.js'; export * from './workspace-split-view-manager.class.js'; export * from './workspace-variant/index.js'; -export * from './workspace-alias.condition.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts index 39790ef18e..b20e7ca65a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts @@ -1,7 +1,9 @@ export * from './entity-manager-controller.js'; export * from './workspace-context.js'; export * from './workspace-context.interface.js'; -export * from './workspace-entity-context.interface.js'; -export * from './workspace-invariantable-entity-context.interface.js'; +export * from './saveable-workspace-context.interface.js'; +export * from './publishable-workspace-context.interface.js'; +export * from './property-structure-workspace-context.interface.js'; +export * from './workspace-invariable-entity-context.interface.js'; export * from './workspace-variable-entity-context.interface.js'; export * from './workspace-context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts new file mode 100644 index 0000000000..64fa491da9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts @@ -0,0 +1,8 @@ +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; + +export interface UmbPropertyStructureWorkspaceContextInterface + extends UmbWorkspaceContextInterface { + + + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/publishable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/publishable-workspace-context.interface.ts new file mode 100644 index 0000000000..2c562b628d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/publishable-workspace-context.interface.ts @@ -0,0 +1,7 @@ +import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; + +export interface UmbPublishableWorkspaceContextInterface + extends UmbSaveableWorkspaceContextInterface { + //getData(): EntityType | undefined; + publish(): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts new file mode 100644 index 0000000000..289e233fa5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts @@ -0,0 +1,7 @@ +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; + +export interface UmbSaveableWorkspaceContextInterface + extends UmbWorkspaceContextInterface { + //getData(): EntityType | undefined; + save(): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts index 2eaf8c53ac..d5aaceae55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts @@ -1,17 +1,25 @@ import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; export interface UmbWorkspaceContextInterface { + destroy(): void; workspaceAlias: string; - repository: any; // TODO: add type + + save(): Promise; + // TODO: temp solution to bubble validation errors to the UI + setValidationErrors?(errorMap: any): void; + + getEntityId(): string | undefined; // Consider if this should go away now that we have getUnique() + // TODO: should we consider another name than entity type. File system files are not entities but still have this type. + getEntityType(): string; + isNew: Observable; getIsNew(): boolean | undefined; setIsNew(value: boolean): void; - getEntityId(): string | undefined; // COnsider if this should go away now that we have getUnique() - // TODO: should we consider another name than entity type. File system files are not entities but still have this type. - getEntityType(): string; + + /* + // TODO: Refactor: This could maybe go away: + repository: any; // TODO: add type getData(): DataType | undefined; - save(): Promise; - destroy(): void; - // TODO: temp solution to bubble validation errors to the UI - setValidationErrors?(errorMap: any): void; + */ + } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts index 9a332bf0e2..d96a6fd155 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts @@ -1,4 +1,4 @@ -import { UmbEntityWorkspaceContextInterface } from './workspace-entity-context.interface.js'; +import { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; @@ -12,13 +12,13 @@ If so we need to align on a interface that all of these implements. otherwise co */ export abstract class UmbWorkspaceContext extends UmbBaseController - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { public readonly host: UmbControllerHostElement; public readonly workspaceAlias: string; public readonly repository: RepositoryType; - // 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. + // 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 }>; #isNew = new UmbBooleanState(undefined); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-entity-context.interface.ts deleted file mode 100644 index 28c083c53c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-entity-context.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; - -export interface UmbEntityWorkspaceContextInterface - extends UmbWorkspaceContextInterface { - getEntityType(): string; // TODO: consider of this should be on the repository because a repo is responsible for one entity type - //getData(): EntityType | undefined; - save(): Promise; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts similarity index 54% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-entity-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts index d36117b3ee..8ce5b98c49 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-entity-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts @@ -1,13 +1,13 @@ -import type { UmbEntityWorkspaceContextInterface } from './workspace-entity-context.interface.js'; +import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { ValueModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -export interface UmbWorkspaceInvariantableEntityContextInterface - extends UmbEntityWorkspaceContextInterface { +export interface UmbInvariableWorkspaceContextInterface + extends UmbSaveableWorkspaceContextInterface { getName(): void; setName(name: string): void; - propertyDataByAlias(alias: string): Observable; + propertyDataById(id: string): Observable; propertyValueByAlias(alias: string): Observable; getPropertyValue(alias: string): void; setPropertyValue(alias: string, value: unknown): void; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts index a7f2da15ac..212e79229c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts @@ -1,10 +1,12 @@ import type { UmbWorkspaceSplitViewManager } from '../workspace-split-view-manager.class.js'; -import type { UmbEntityWorkspaceContextInterface } from './workspace-entity-context.interface.js'; +import type { UmbDatasetContext } from '../dataset-context/dataset-context.interface.js'; +import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { ValueModelBaseModel, VariantResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export interface UmbWorkspaceVariableEntityContextInterface extends UmbEntityWorkspaceContextInterface { +export interface UmbVariableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { variants: Observable>; splitView: UmbWorkspaceSplitViewManager; @@ -14,8 +16,14 @@ export interface UmbWorkspaceVariableEntityContextInterface extends getVariant(variantId: UmbVariantId): VariantResponseModelBaseModel | undefined; - propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; + //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; + + // This one is async cause it needs to structure to provide this data: + propertyDataById(id: string): Promise>; propertyValueByAlias(alias: string, variantId?: UmbVariantId): Observable; getPropertyValue(alias: string, variantId?: UmbVariantId): void; setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId): void; + + // Dataset methods: + createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbDatasetContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts index ec25e1c418..4efd6c8128 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts @@ -1,7 +1,7 @@ -import { UmbWorkspaceVariableEntityContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; +import { UmbVariableWorkspaceContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; import { UmbPropertyEditorExtensionElement } from '../../extension-registry/interfaces/property-editor-ui-extension-element.interface.js'; import { type WorkspacePropertyData } from '../types/workspace-property-data.type.js'; -import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { @@ -51,13 +51,13 @@ export class UmbWorkspacePropertyContext { private _variantDifference = new UmbStringState(undefined); public readonly variantDifference = this._variantDifference.asObservable(); - private _workspaceContext?: UmbWorkspaceVariableEntityContextInterface; - private _workspaceVariantConsumer?: UmbContextConsumerController; + private _workspaceContext?: UmbVariableWorkspaceContextInterface; + private _workspaceVariantConsumer?: UmbContextConsumerController; constructor(host: UmbControllerHostElement) { this.#host = host; new UmbContextConsumerController(host, UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this._workspaceContext = workspaceContext as UmbWorkspaceVariableEntityContextInterface; + this._workspaceContext = workspaceContext as UmbVariableWorkspaceContextInterface; }); this._providerController = new UmbContextProviderController(host, UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, this); @@ -71,7 +71,7 @@ export class UmbWorkspacePropertyContext { if (!this._workspaceVariantConsumer) { this._workspaceVariantConsumer = new UmbContextConsumerController( this.#host, - UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, + UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, (workspaceVariantContext) => { new UmbObserverController(this.#host, workspaceVariantContext.variantId, (workspaceVariantId) => { this.#workspaceVariantId = workspaceVariantId; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts index 3bc643d7aa..afbed12d8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts @@ -1,3 +1,3 @@ export * from './variantable-property/variantable-property.element.js'; -export * from './workspace-variant.context.js'; -export * from './workspace-variant.element.js'; +export * from './workspace-split-view.context.js'; +export * from './workspace-split-view.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts index 8b93b55615..d8c622df56 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts @@ -1,4 +1,4 @@ -import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../workspace-variant.context.js'; +import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT } from '../workspace-split-view.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -17,7 +17,7 @@ export class UmbVariantablePropertyElement extends UmbLitElement { this._updatePropertyVariantId(); } - private _variantContext?: typeof UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN.TYPE; + private _variantContext?: typeof UMB_WORKSPACE_SPLIT_VIEW_CONTEXT.TYPE; @state() private _workspaceVariantId?: UmbVariantId; @@ -27,7 +27,8 @@ export class UmbVariantablePropertyElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, (workspaceContext) => { + // TODO: Refactor: this could use the new DataSetContext: + this.consumeContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, (workspaceContext) => { this._variantContext = workspaceContext; this._observeVariantContext(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts new file mode 100644 index 0000000000..f080fb5916 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts @@ -0,0 +1,119 @@ +import { UmbVariableWorkspaceContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; +import { UMB_WORKSPACE_CONTEXT } from '../workspace-context/workspace-context.token.js'; +import { UmbDatasetContext } from '../dataset-context/index.js'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { + UmbContextToken, +} from '@umbraco-cms/backoffice/context-api'; +import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { + UmbClassState, + UmbNumberState, +} from '@umbraco-cms/backoffice/observable-api'; + + +export class UmbWorkspaceSplitViewContext extends UmbBaseController { + + #workspaceContext?: UmbVariableWorkspaceContextInterface; + public getWorkspaceContext() { + return this.#workspaceContext; + } + + // TODO: Refactor: use a variable data set context interface here. + #dataSetContext?: UmbDatasetContext; + + #index = new UmbNumberState(undefined); + index = this.#index.asObservable(); + + #variantId = new UmbClassState(undefined); + variantId = this.#variantId.asObservable(); + + constructor(host: UmbControllerHost) { + super(host); + + // TODO: Make a UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN, and interface for such. + this.consumeContext(UMB_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context as UmbVariableWorkspaceContextInterface; + this._observeVariant(); + }); + + this.observe(this.#index, () => { + this._observeVariant(); + }); + + + this.provideContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, this); + } + + private _observeVariant() { + if (!this.#workspaceContext) return; + + const index = this.#index.getValue(); + if (index === undefined) return; + + // TODO: Should splitView be put into its own context?... a split view manager context? one which might have a reference to the workspace context, so we still can ask that about how to create the dataset context. + this.observe( + this.#workspaceContext.splitView.activeVariantByIndex(index), + async (activeVariantInfo) => { + if (!activeVariantInfo) return; + + // TODO: Ask workspace context to create the specific dataset. + + this.#dataSetContext?.destroy(); + const variantId = this.#variantId.getValue(); + if(variantId) { + this.#dataSetContext = this.#workspaceContext?.createVariableDatasetContext(this, UmbVariantId.Create(activeVariantInfo)); + } + }, + '_observeActiveVariant' + ); + } + + + public switchVariant(variant: UmbVariantId) { + const index = this.#index.value; + if (index === undefined) return; + this.#workspaceContext?.splitView.switchVariant(index, variant); + } + + public closeSplitView() { + const index = this.#index.value; + if (index === undefined) return; + this.#workspaceContext?.splitView.closeSplitView(index); + } + + public openSplitView(variant: UmbVariantId) { + this.#workspaceContext?.splitView.openSplitView(variant); + } + + public changeVariant(culture: string | null, segment: string | null) { + const index = this.#index.getValue(); + if (index === undefined) return; + this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); + } + + public getSplitViewIndex() { + return this.#index.getValue(); + } + public setSplitViewIndex(index: number) { + this.#index.next(index); + } + + + + + /** + * + * concept this class could have methods to set and get the culture and segment of the active variant? just by using the index. + */ + + /* + public destroy(): void { + + } + */ +} + +export const UMB_WORKSPACE_SPLIT_VIEW_CONTEXT = new UmbContextToken( + 'umbWorkspaceSplitViewContext' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.element.ts similarity index 67% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.element.ts index e73ccd6551..444274f81e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.element.ts @@ -1,6 +1,6 @@ -import { UmbWorkspaceVariantContext } from './workspace-variant.context.js'; +import { UmbWorkspaceSplitViewContext } from './workspace-split-view.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** @@ -9,8 +9,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; * As well breadcrumbs etc. * */ -@customElement('umb-workspace-variant') -export class UmbWorkspaceVariantContentElement extends UmbLitElement { +@customElement('umb-workspace-split-view') +export class UmbWorkspaceSplitViewElement extends UmbLitElement { // TODO: stop prop drilling this alias. Instead use the workspace context. @property() alias!: string; @@ -20,19 +20,14 @@ export class UmbWorkspaceVariantContentElement extends UmbLitElement { @property({ type: Number }) public set splitViewIndex(index: number) { - this._splitViewIndex = index; - this.variantContext.setSplitViewIndex(index); + this.splitViewContext.setSplitViewIndex(index); } - @state() - private _splitViewIndex = 0; - - variantContext = new UmbWorkspaceVariantContext(this); + splitViewContext = new UmbWorkspaceSplitViewContext(this); render() { return html` @@ -67,10 +62,10 @@ export class UmbWorkspaceVariantContentElement extends UmbLitElement { ]; } -export default UmbWorkspaceVariantContentElement; +export default UmbWorkspaceSplitViewElement; declare global { interface HTMLElementTagNameMap { - 'umb-workspace-variant': UmbWorkspaceVariantContentElement; + 'umb-workspace-split-view': UmbWorkspaceSplitViewElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts deleted file mode 100644 index 723ef79d03..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { UmbWorkspaceVariableEntityContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { - UmbContextConsumerController, - UmbContextProviderController, - UmbContextToken, -} from '@umbraco-cms/backoffice/context-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { - UmbClassState, - UmbNumberState, - UmbObjectState, - UmbObserverController, -} from '@umbraco-cms/backoffice/observable-api'; -import { DocumentVariantResponseModel } from '@umbraco-cms/backoffice/backend-api'; - -//type EntityType = DocumentModel; - -export class UmbWorkspaceVariantContext { - #host: UmbControllerHostElement; - - #workspaceContext?: UmbWorkspaceVariableEntityContextInterface; - public getWorkspaceContext() { - return this.#workspaceContext; - } - - #index = new UmbNumberState(undefined); - index = this.#index.asObservable(); - - #currentVariant = new UmbObjectState(undefined); - currentVariant = this.#currentVariant.asObservable(); - - name = this.#currentVariant.asObservablePart((x) => x?.name); - culture = this.#currentVariant.asObservablePart((x) => x?.culture); - segment = this.#currentVariant.asObservablePart((x) => x?.segment); - - #variantId = new UmbClassState(undefined); - variantId = this.#variantId.asObservable(); - - constructor(host: UmbControllerHostElement) { - this.#host = host; - - new UmbContextProviderController(host, UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN.toString(), this); - - // How do we ensure this connects to a document workspace context? and not just any other context? (We could start providing workspace contexts twice, under the general name and under a specific name) - // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken - new UmbContextConsumerController(host, UMB_WORKSPACE_CONTEXT, (context) => { - this.#workspaceContext = context as UmbWorkspaceVariableEntityContextInterface; - this._observeVariant(); - }); - - new UmbObserverController(host, this.#index, () => { - this._observeVariant(); - }); - } - - public switchVariant(variant: DocumentVariantResponseModel) { - const index = this.#index.value; - if (index === undefined) return; - this.#workspaceContext?.splitView.switchVariant(index, new UmbVariantId(variant)); - } - - public closeSplitView() { - const index = this.#index.value; - if (index === undefined) return; - this.#workspaceContext?.splitView.closeSplitView(index); - } - - public openSplitView(variant: DocumentVariantResponseModel) { - this.#workspaceContext?.splitView.openSplitView(new UmbVariantId(variant)); - } - - private _setVariantId(variantId: UmbVariantId) { - this.#variantId.next(variantId); - return variantId; - } - - private _observeVariant() { - if (!this.#workspaceContext) return; - - const index = this.#index.getValue(); - if (index === undefined) return; - - new UmbObserverController( - this.#host, - this.#workspaceContext.splitView.activeVariantByIndex(index), - async (activeVariantInfo) => { - if (!activeVariantInfo) return; - const variantId = this._setVariantId(UmbVariantId.Create(activeVariantInfo)); - const currentVariant = await this.#workspaceContext?.getVariant(variantId); - this.#currentVariant.next(currentVariant); - }, - '_observeActiveVariant' - ); - } - - public changeVariant(culture: string | null, segment: string | null) { - const index = this.#index.getValue(); - if (index === undefined) return; - this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); - } - - public getSplitViewIndex() { - return this.#index.getValue(); - } - public setSplitViewIndex(index: number) { - this.#index.next(index); - } - - public setName(newName: string) { - const variantId = this.#variantId.getValue(); - if (!this.#workspaceContext || !variantId) return; - this.#workspaceContext.setName(newName, variantId); - } - - /** - * - * concept this class could have methods to set and get the culture and segment of the active variant? just by using the index. - */ - - /* - public destroy(): void { - - } - */ -} - -export const UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN = new UmbContextToken( - 'umbWorkspaceVariantContext' -); diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts index 65a134993d..2990d526eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbDictionaryRepository } from '../repository/dictionary.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { DictionaryItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbDictionaryWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -86,7 +86,7 @@ export class UmbDictionaryWorkspaceContext } -export const UMB_DICTIONARY_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DICTIONARY_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbDictionaryWorkspaceContext => context.getEntityType?.() === 'dictionary-item' ); 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 28582fa254..4cc9b70c01 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 @@ -1,6 +1,6 @@ import { UmbDocumentTypeRepository } from '../repository/document-type.repository.js'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; -import { UmbWorkspaceContext, UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import { UmbWorkspaceContext, UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { ContentTypeCompositionModel, ContentTypeSortModel, @@ -12,7 +12,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = DocumentTypeResponseModel; export class UmbDocumentTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { // Draft is located in structure manager @@ -157,7 +157,7 @@ export class UmbDocumentTypeWorkspaceContext } -export const UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbDocumentTypeWorkspaceContext => context.getEntityType?.() === 'document-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts new file mode 100644 index 0000000000..a6870731af --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts @@ -0,0 +1,99 @@ +import { UmbDocumentWorkspaceContext } from "../workspace/index.js"; +import { DocumentVariantResponseModel, PropertyTypeModelBaseModel } from "@umbraco-cms/backoffice/backend-api"; +import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; +import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; +import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; +import { UMB_DATASET_CONTEXT, UmbVariantDatasetContext } from "@umbraco-cms/backoffice/workspace"; + +export class UmbDocumentDatasetContext extends UmbBaseController implements UmbVariantDatasetContext { + + #workspace: UmbDocumentWorkspaceContext; + #variantId: UmbVariantId; + public getVariantId() { + return this.#variantId; + } + + #currentVariant = new UmbObjectState(undefined); + currentVariant = this.#currentVariant.asObservable(); + + name = this.#currentVariant.asObservablePart((x) => x?.name); + culture = this.#currentVariant.asObservablePart((x) => x?.culture); + segment = this.#currentVariant.asObservablePart((x) => x?.segment); + + + getType(): string { + return this.#workspace.getEntityType(); + } + getUnique(): string | undefined { + return this.#workspace.getEntityId(); + } + getName(): string | undefined { + return this.#workspace.getName(this.#variantId); + } + setName(name: string) { + this.#workspace.setName(name, this.#variantId); + } + getVariantInfo() { + return this.#workspace.getVariant(this.#variantId); + } + + + + constructor(host: UmbControllerHost, workspace: UmbDocumentWorkspaceContext, variantId: UmbVariantId) { + // The controller alias, is a very generic name cause we want only one of these for this controller host. + super(host, 'dataSetContext'); + this.#workspace = workspace; + this.#variantId = variantId; + + this.observe( + this.#workspace.variantById(this.#variantId), + async (variantInfo) => { + if (!variantInfo) return; + this.#currentVariant.next(variantInfo); + }, + '_observeActiveVariant' + ); + + // TODO: Refactor: use the document dataset context token. + this.provideContext(UMB_DATASET_CONTEXT, this); + } + + + #createPropertyVariantId(property:PropertyTypeModelBaseModel) { + return UmbVariantId.Create({ + culture: property.variesByCulture ? this.#variantId.culture : null, + segment: property.variesBySegment ? this.#variantId.segment : null, + }); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async propertyValueByAlias(propertyAlias: string) { + // This is not reacting to if the property variant settings changes while running. + const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); + if(property) { + const variantId = this.#createPropertyVariantId(property); + if(property.alias) { + return this.#workspace.propertyValueByAlias(property.alias, variantId); + } + } + return undefined; + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async setPropertyValue(propertyAlias: string, value: unknown) { + // This is not reacting to if the property variant settings changes while running. + const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); + if(property) { + const variantId = this.#createPropertyVariantId(property); + + // This is not reacting to if the property variant settings changes while running. + this.#workspace.setPropertyValue(propertyAlias, value, variantId); + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts index 03a0a78f2c..2caf004dae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts @@ -10,6 +10,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-workspace-editor') export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { //private _defaultVariant?: VariantViewModelBaseModel; + + // TODO: Refactor: when having a split view/variants context token, we can rename the split view/variants component to a generic and make this component generic as well. private splitViewElement = new UmbDocumentWorkspaceSplitViewElement(); @state() diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts index 3b53f112e6..4b9f8e91dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts @@ -5,11 +5,9 @@ import { ActiveVariant } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-workspace-split-view') export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { + // TOOD: Refactor: use the split view context token: private _workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; - @state() - _unique?: string; - @state() _variants?: Array; @@ -41,10 +39,10 @@ export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { (view) => view.index + '_' + (view.culture ?? '') + '_' + (view.segment ?? '') + '_' + this._variants!.length, (view) => html` - + .displayNavigation=${view.index === this._variants!.length - 1}> ` )} 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 f893bbc8e9..a01aadcab0 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 @@ -1,12 +1,14 @@ import { UmbDocumentRepository } from '../repository/document.repository.js'; import { UmbDocumentTypeRepository } from '../../document-types/repository/document-type.repository.js'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UmbDocumentDatasetContext } from '../dataset-context/document-dataset-context.js'; +import { type UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import { - UmbEntityWorkspaceContextInterface, + UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceSplitViewManager, - UmbWorkspaceVariableEntityContextInterface, + UmbVariableWorkspaceContextInterface, + type UmbDatasetContext, } from '@umbraco-cms/backoffice/workspace'; import type { CreateDocumentRequestModel, DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { @@ -15,8 +17,9 @@ import { UmbObjectState, UmbObserverController, } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; // TODO: should this context be called DocumentDraft instead of workspace? or should the draft be part of this? // TODO: Should we have a DocumentStructureContext and maybe even a DocumentDraftContext? @@ -24,25 +27,25 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = DocumentResponseModel; export class UmbDocumentWorkspaceContext extends UmbWorkspaceContext - implements UmbWorkspaceVariableEntityContextInterface + implements UmbVariableWorkspaceContextInterface { /** * The document is the current stored version of the document. * For now lets not share this publicly as it can become confusing. - * TODO: Use this to compare, for variants with changes. + * TODO: This concept is to be able to compare if there is changes since the saved one. */ - #document = new UmbObjectState(undefined); + //#persistedData = new UmbObjectState(undefined); /** * The document is the current state/draft version of the document. */ - #draft = new UmbObjectState(undefined); - readonly unique = this.#draft.asObservablePart((data) => data?.id); - readonly documentTypeKey = this.#draft.asObservablePart((data) => data?.contentTypeId); + #currentData = new UmbObjectState(undefined); + readonly unique = this.#currentData.asObservablePart((data) => data?.id); + readonly documentTypeKey = this.#currentData.asObservablePart((data) => data?.contentTypeId); - readonly variants = this.#draft.asObservablePart((data) => data?.variants || []); - readonly urls = this.#draft.asObservablePart((data) => data?.urls || []); - readonly templateId = this.#draft.asObservablePart((data) => data?.templateId || null); + readonly variants = this.#currentData.asObservablePart((data) => data?.variants || []); + readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []); + readonly templateId = this.#currentData.asObservablePart((data) => data?.templateId || null); readonly structure; readonly splitView; @@ -65,8 +68,8 @@ export class UmbDocumentWorkspaceContext if (!data) return undefined; this.setIsNew(false); - this.#document.next(data); - this.#draft.next(data); + //this.#persisted.next(data); + this.#currentData.next(data); return data || undefined; } @@ -75,13 +78,12 @@ export class UmbDocumentWorkspaceContext if (!data) return undefined; this.setIsNew(true); - this.#document.next(data); - this.#draft.next(data); + this.#currentData.next(data); return data || undefined; } getData() { - return this.#draft.getValue() || {}; + return this.#currentData.getValue() || {}; } /* @@ -102,12 +104,16 @@ export class UmbDocumentWorkspaceContext return this.getData().contentTypeId; } + variantById(variantId: UmbVariantId) { + return this.#currentData.asObservablePart((data) => data?.variants?.find((x) => variantId.compare(x))); + } + getVariant(variantId: UmbVariantId) { - return this.#draft.getValue()?.variants?.find((x) => variantId.compare(x)); + return this.#currentData.getValue()?.variants?.find((x) => variantId.compare(x)); } getName(variantId?: UmbVariantId) { - const variants = this.#draft.getValue()?.variants; + const variants = this.#currentData.getValue()?.variants; if (!variants) return; if (variantId) { return variants.find((x) => variantId.compare(x))?.name; @@ -117,67 +123,61 @@ export class UmbDocumentWorkspaceContext } setName(name: string, variantId?: UmbVariantId) { - const oldVariants = this.#draft.getValue()?.variants || []; + const oldVariants = this.#currentData.getValue()?.variants || []; const variants = partialUpdateFrozenArray( oldVariants, { name }, variantId ? (x) => variantId.compare(x) : () => true ); - this.#draft.update({ variants }); + this.#currentData.update({ variants }); } - propertyValuesOf(variantId?: UmbVariantId) { - return this.#draft.asObservablePart((data) => - variantId ? data?.values?.filter((x) => variantId.compare(x)) : data?.values - ); + propertyDataById(propertyId: string) { + return this.structure.propertyStructureById(propertyId); } - propertyDataByAlias(propertyAlias: string, variantId?: UmbVariantId) { - return this.#draft.asObservablePart((data) => - data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true)) - ); - } - propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId) { - return this.#draft.asObservablePart( + propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId): Observable { + return this.#currentData.asObservablePart( (data) => data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))?.value ); } - getPropertyValue(alias: string, variantId?: UmbVariantId): void { - const currentData = this.#draft.value; + getPropertyValue(alias: string, variantId?: UmbVariantId): PropertyValueType | undefined { + const currentData = this.#currentData.value; if (currentData) { const newDataSet = currentData.values?.find( (x) => x.alias === alias && (variantId ? variantId.compare(x) : true) ); return newDataSet?.value; } + return undefined; } - setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId) { + setPropertyValue(alias: string, value: PropertyValueType, variantId?: UmbVariantId) { const entry = { ...variantId?.toObject(), alias, value }; - const currentData = this.#draft.value; + const currentData = this.#currentData.value; if (currentData) { const values = appendToFrozenArray( currentData.values || [], entry, (x) => x.alias === alias && (variantId ? variantId.compare(x) : true) ); - this.#draft.update({ values }); + this.#currentData.update({ values }); } } async save() { - if (!this.#draft.value) return; - if (!this.#draft.value.id) return; + if (!this.#currentData.value) return; + if (!this.#currentData.value.id) return; if (this.getIsNew()) { // TODO: typescript hack until we get the create type - const value = this.#draft.value as CreateDocumentRequestModel & { id: string }; + const value = this.#currentData.value as CreateDocumentRequestModel & { id: string }; if ((await this.repository.create(value)).data !== undefined) { this.setIsNew(false); } } else { - await this.repository.save(this.#draft.value.id, this.#draft.value); + await this.repository.save(this.#currentData.value.id, this.#currentData.value); } this.saveComplete(this.getData()); @@ -199,8 +199,12 @@ export class UmbDocumentWorkspaceContext } */ + public createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbDatasetContext { + return new UmbDocumentDatasetContext(host, this, variantId); + } + public destroy(): void { - this.#draft.complete(); + this.#currentData.complete(); this.structure.destroy(); super.destroy(); } @@ -209,7 +213,8 @@ export class UmbDocumentWorkspaceContext export default UmbDocumentWorkspaceContext; -export const UMB_DOCUMENT_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DOCUMENT_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', + // TODO: Refactor: make a better generic way to identify workspaces, maybe workspaceType or workspaceAlias?. (context): context is UmbDocumentWorkspaceContext => context.getEntityType?.() === 'document' ); 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 af3dc52196..89d0e4568a 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 @@ -1,6 +1,6 @@ import { UmbMediaTypeRepository } from '../repository/media-type.repository.js'; import type { MediaTypeDetails } from '../types.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -8,7 +8,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MediaTypeDetails; export class UmbMediaTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -64,7 +64,7 @@ export class UmbMediaTypeWorkspaceContext } -export const UMB_MEDIA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEDIA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMediaTypeWorkspaceContext => context.getEntityType?.() === 'media-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 be6dc2a30c..8d5148c25b 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 @@ -1,6 +1,6 @@ import { UmbMediaRepository } from '../repository/media.repository.js'; import type { MediaDetails } from '../index.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -8,7 +8,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MediaDetails; export class UmbMediaWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -83,7 +83,7 @@ export class UmbMediaWorkspaceContext } } -export const UMB_MEDIA_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEDIA_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMediaWorkspaceContext => context.getEntityType?.() === 'media' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts index 3de2301159..73ae447b63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbMemberGroupRepository } from '../repository/member-group.repository.js'; import type { MemberGroupDetails } from '../types.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -8,7 +8,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MemberGroupDetails; export class UmbMemberGroupWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -67,7 +67,7 @@ export class UmbMemberGroupWorkspaceContext -export const UMB_MEMBER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEMBER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMemberGroupWorkspaceContext => context.getEntityType?.() === 'member-group' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts index 89d557f61c..49994e0df6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbMemberTypeRepository } from '../repository/member-type.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -9,7 +9,7 @@ type EntityType = any; export class UmbMemberTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); name = this.#data.asObservablePart((data) => data?.name); @@ -75,7 +75,7 @@ export class UmbMemberTypeWorkspaceContext } } -export const UMB_MEMBER_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEMBER_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMemberTypeWorkspaceContext => context.getEntityType?.() === 'member-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts index 20aecf8e28..17804d541f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts @@ -1,12 +1,12 @@ import { UmbMemberRepository } from '../repository/member.repository.js'; import type { MemberDetails } from '../types.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbMemberWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { constructor(host: UmbControllerHostElement) { super(host, 'Umb.Workspace.Member', new UmbMemberRepository(host)); @@ -37,7 +37,7 @@ export class UmbMemberWorkspaceContext } } -export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === 'member' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index 4019f99469..ed2733d10c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbDataTypeRepository } from '../repository/data-type.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbDataTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { // TODO: revisit. temp solution because the create and response models are different. #data = new UmbObjectState(undefined); @@ -97,7 +97,7 @@ export class UmbDataTypeWorkspaceContext } } -export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbDataTypeWorkspaceContext => context.getEntityType?.() === 'data-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts index 1b8609c9b1..b749c5f662 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbLanguageRepository } from '../../repository/language.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { ApiError, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbLanguageWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -103,7 +103,7 @@ export class UmbLanguageWorkspaceContext } -export const UMB_LANGUAGE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_LANGUAGE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbLanguageWorkspaceContext => context.getEntityType?.() === 'language' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts index d8e9eb97d4..b871b61208 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbRelationTypeRepository } from '../repository/relation-type.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { RelationTypeBaseModel, RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbRelationTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -79,7 +79,7 @@ export class UmbRelationTypeWorkspaceContext -export const UMB_RELATION_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_RELATION_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbRelationTypeWorkspaceContext => context.getEntityType?.() === 'relation-type' ); 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 dca98153e4..19b5fcc98a 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 @@ -2,7 +2,7 @@ import { UmbPartialViewsRepository } from '../repository/partial-views.repositor import { PartialViewDetails } from '../config.js'; import { createObservablePart, UmbBooleanState, UmbDeepState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { UpdatePartialViewRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -10,7 +10,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbPartialViewWorkspaceContext extends UmbWorkspaceContext< UmbPartialViewsRepository, PartialViewDetails -> implements UmbEntityWorkspaceContextInterface { +> implements UmbSaveableWorkspaceContextInterface { getEntityId(): string | undefined { return this.getData()?.path; } @@ -101,7 +101,7 @@ export class UmbPartialViewWorkspaceContext extends UmbWorkspaceContext< -export const UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbPartialViewWorkspaceContext => context.getEntityType?.() === 'partial-view' ); 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 fd1ba1098a..395a720cd1 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 @@ -1,11 +1,11 @@ import { UmbStylesheetRepository } from '../repository/stylesheet.repository.js'; import { StylesheetDetails } from '../index.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { +export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -42,7 +42,7 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext( +export const UMB_STYLESHEET_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbStylesheetWorkspaceContext => context.getEntityType?.() === 'stylesheet' ); 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 eb16956d22..3513ae3800 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 @@ -1,6 +1,6 @@ import { UmbTemplateRepository } from '../repository/template.repository.js'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { createObservablePart, UmbBooleanState, @@ -11,7 +11,7 @@ import type { TemplateItemResponseModel, TemplateResponseModel } from '@umbraco- import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { +export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext implements UmbSaveableWorkspaceContextInterface { #data = new UmbDeepState(undefined); data = this.#data.asObservable(); #masterTemplate = new UmbObjectState(null); @@ -170,7 +170,7 @@ ${currentContent}`; -export const UMB_TEMPLATE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_TEMPLATE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbTemplateWorkspaceContext => context.getEntityType?.() === 'template' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts index b9ce1e2fe3..28021f1f2f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbUserGroupRepository } from '../repository/user-group.repository.js'; import { UmbUserRepository } from '../../users/repository/user.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -8,7 +8,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbUserGroupWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -105,7 +105,7 @@ export class UmbUserGroupWorkspaceContext } -export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbUserGroupWorkspaceContext => context.getEntityType?.() === 'user-group' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts index b9c4567217..9ac4fc84a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbUserRepository } from '../repository/user.repository.js'; import { type UmbUserDetail } from '../index.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import type { UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; @@ -10,7 +10,7 @@ import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; export class UmbUserWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #authContext?: typeof UMB_AUTH.TYPE; @@ -82,7 +82,7 @@ export class UmbUserWorkspaceContext } } -export const UMB_USER_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_USER_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbUserWorkspaceContext => context.getEntityType?.() === 'user' ); From 9c632188856e358e7bbb1df69d5c2323d135823f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Sun, 27 Aug 2023 18:59:56 +0200 Subject: [PATCH 34/75] fix broken story --- .../core/components/variant-selector/variant-selector.stories.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.stories.ts index c5e50500c7..4827af62be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.stories.ts @@ -12,6 +12,5 @@ type Story = StoryObj; export const Overview: Story = { args: { - alias: 'myAlias', }, }; From eae0e8c555e522c8013be4617f66297d2ecd0689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Sun, 27 Aug 2023 20:49:00 +0200 Subject: [PATCH 35/75] variant dataset for documents --- .../property-editor-config.element.ts | 1 + .../property-type-based-property.element.ts | 31 +----- .../content-type-structure-manager.class.ts | 14 +++ .../packages/core/variant/variant-id.class.ts | 4 + .../dataset-context.interface.ts | 5 +- .../variant-dataset-context.interface.ts | 7 +- .../saveable-workspace-context.interface.ts | 6 ++ .../workspace-property.context.ts | 97 +++++++++++-------- .../workspace-property.element.ts | 30 +----- .../variantable-property.element.ts | 1 + .../workspace-split-view.context.ts | 15 +-- .../document-dataset-context.ts | 16 +++ .../workspace/document-workspace.context.ts | 6 +- ...-workspace-view-edit-properties.element.ts | 2 +- 14 files changed, 122 insertions(+), 113 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index fc684bd238..903cd08b28 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -97,6 +97,7 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { /** * Get the stored value for a property. It will render the default value from the configuration if no value is stored in the database. */ + // TODO: Refactor: setup a dataset for this, otherwise we cannot ensure features, neither the right reactivity. private _getValue(property: PropertyEditorConfigProperty) { const value = this.data.find((data) => data.alias === property.alias)?.value; if (value) return value; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts index 30ed7b8c57..8b055da2f8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts @@ -2,7 +2,6 @@ import { UmbDataTypeConfig } from '../../property-editor/index.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbDataTypeRepository } from '@umbraco-cms/backoffice/data-type'; -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { DataTypeResponseModel, PropertyTypeModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -19,7 +18,6 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { this._property = value; if (this._property?.dataTypeId !== oldProperty?.dataTypeId) { this._observeDataType(this._property?.dataTypeId); - this._observeProperty(); } } private _property?: PropertyTypeModelBaseModel; @@ -33,9 +31,6 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { private _dataTypeRepository: UmbDataTypeRepository = new UmbDataTypeRepository(this); private _dataTypeObserver?: UmbObserverController; - @state() - private _value?: unknown; - /** * propertyVariantId. A VariantID to identify which the variant of this properties value. * @public @@ -43,6 +38,7 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { * @attr * @default undefined */ + // TODO: Refactor: this can be simplified.. @property({ type: Object, attribute: false }) public get propertyVariantId(): UmbVariantId | undefined { return this._propertyVariantId; @@ -51,34 +47,10 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { const oldValue = this._propertyVariantId; if (value && oldValue?.equal(value)) return; this._propertyVariantId = value; - this._observeProperty(); this.requestUpdate('propertyVariantId', oldValue); } private _propertyVariantId?: UmbVariantId | undefined; - private _workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; - - constructor() { - super(); - this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (workspaceContext) => { - this._workspaceContext = workspaceContext; - this._observeProperty(); - }); - } - - private _observePropertyValue?: UmbObserverController; - private _observeProperty() { - if (!this._workspaceContext || !this.property || !this._property?.alias) return; - - this._observePropertyValue?.destroy(); - this._observePropertyValue = this.observe( - this._workspaceContext.propertyValueByAlias(this._property.alias, this._propertyVariantId), - (value) => { - this._value = value; - }, - '_observePropertyValue' - ); - } private async _observeDataType(dataTypeId?: string) { this._dataTypeObserver?.destroy(); @@ -115,7 +87,6 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { label=${ifDefined(this._property?.name)} description=${ifDefined(this._property?.description || undefined)} property-editor-ui-alias=${ifDefined(this._propertyEditorUiAlias)} - .value=${this._value} .propertyVariantId=${this.propertyVariantId} .config=${this._dataTypeData}>`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index 5256114c33..acc0862b34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -322,6 +322,20 @@ export class UmbContentTypePropertyStructureManager { + for (const docType of docTypes) { + const foundProp = docType.properties?.find((property) => property.alias === propertyAlias); + if(foundProp) { + return foundProp; + } + } + return undefined; + }); + } async getPropertyStructureById(propertyId: string) { await this.#init; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts index 09824e4e46..38aa1f32b4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts @@ -25,6 +25,10 @@ export class UmbVariantId { return (this.culture || 'invariant') + (this.segment ? `_${this.segment}` : ''); } + public isInvariant(): boolean { + return this.culture === null && this.segment === null; + } + public toObject(): variantObject { return { culture: this.culture, segment: this.segment }; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts index d1aeb705e7..33576b4fce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts @@ -1,4 +1,5 @@ -import { type Observable } from "@umbraco-cms/backoffice/external/rxjs"; +import type { Observable } from "@umbraco-cms/backoffice/external/rxjs"; +import type { UmbVariantId } from "../../variant/variant-id.class.js"; /** * Represents a set of properties. @@ -18,6 +19,7 @@ export interface UmbDatasetContext { getType(): string; getUnique(): string | undefined; //getUniqueName(): string; + getVariantId: undefined | (() => UmbVariantId | undefined); getName(): string | undefined; readonly name: Observable; @@ -25,6 +27,7 @@ export interface UmbDatasetContext { destroy(): void; // Property methods: + propertyVariantId(propertyAlias: string): Promise | undefined>; propertyValueByAlias(propertyAlias: string): Promise | undefined>; setPropertyValue(propertyAlias: string, value: unknown): Promise; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts index 7dcbc04497..f1d92fdd32 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts @@ -1,10 +1,7 @@ -import { type UmbVariantId } from "../../variant/variant-id.class.js"; import { UmbDatasetContext } from "./dataset-context.interface.js"; -import { type Observable } from "@umbraco-cms/backoffice/external/rxjs"; +import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; export interface UmbVariantDatasetContext extends UmbDatasetContext { - - getVariantId(): UmbVariantId; - + getVariantId: () => UmbVariantId | undefined; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts index 289e233fa5..ad051d09a8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts @@ -1,7 +1,13 @@ +import { UmbDatasetContext } from '../dataset-context/dataset-context.interface.js'; import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbSaveableWorkspaceContextInterface extends UmbWorkspaceContextInterface { //getData(): EntityType | undefined; save(): Promise; + + + // Dataset methods: + createDatasetContext(host: UmbControllerHost): UmbDatasetContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts index 4efd6c8128..6147f53c48 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts @@ -1,9 +1,8 @@ -import { UmbVariableWorkspaceContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; import { UmbPropertyEditorExtensionElement } from '../../extension-registry/interfaces/property-editor-ui-extension-element.interface.js'; import { type WorkspacePropertyData } from '../types/workspace-property-data.type.js'; -import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UMB_DATASET_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBaseController, type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbClassState, UmbObjectState, @@ -12,14 +11,12 @@ import { UmbBasicState, } from '@umbraco-cms/backoffice/observable-api'; import { - UmbContextConsumerController, UmbContextProviderController, UmbContextToken, } from '@umbraco-cms/backoffice/context-api'; import { UmbDataTypeConfigCollection } from '@umbraco-cms/backoffice/components'; -export class UmbWorkspacePropertyContext { - #host: UmbControllerHostElement; +export class UmbWorkspacePropertyContext extends UmbBaseController { private _providerController: UmbContextProviderController; @@ -43,52 +40,73 @@ export class UmbWorkspacePropertyContext { return this._editor.getValue(); } - #workspaceVariantId?: UmbVariantId; - + // property variant ID: #variantId = new UmbClassState(undefined); public readonly variantId = this.#variantId.asObservable(); private _variantDifference = new UmbStringState(undefined); public readonly variantDifference = this._variantDifference.asObservable(); - private _workspaceContext?: UmbVariableWorkspaceContextInterface; - private _workspaceVariantConsumer?: UmbContextConsumerController; + #datasetContext?: typeof UMB_DATASET_CONTEXT.TYPE; constructor(host: UmbControllerHostElement) { - this.#host = host; - new UmbContextConsumerController(host, UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this._workspaceContext = workspaceContext as UmbVariableWorkspaceContextInterface; + super(host); + + this.consumeContext(UMB_DATASET_CONTEXT, (datasetContext) => { + this.#datasetContext = datasetContext; + this._generateVariantDifferenceString(); + this._observeProperty(); }); this._providerController = new UmbContextProviderController(host, UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, this); - this.configValues.subscribe((configValues) => { + this.observe(this.configValues, (configValues) => { this.#configCollection.next(configValues ? new UmbDataTypeConfigCollection(configValues) : undefined); }); - this.variantId.subscribe((propertyVariantId) => { - if (propertyVariantId) { - if (!this._workspaceVariantConsumer) { - this._workspaceVariantConsumer = new UmbContextConsumerController( - this.#host, - UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, - (workspaceVariantContext) => { - new UmbObserverController(this.#host, workspaceVariantContext.variantId, (workspaceVariantId) => { - this.#workspaceVariantId = workspaceVariantId; - this._generateVariantDifferenceString(); - }); - } - ); - } else { - this._generateVariantDifferenceString(); - } - } + this.observe(this.variantId, () => { + this._generateVariantDifferenceString(); }); } + + private _observePropertyVariant?: UmbObserverController; + private _observePropertyValue?: UmbObserverController; + private async _observeProperty() { + const alias = this.#data.getValue().alias; + if (!this.#datasetContext || !alias) return; + + const variantIdSubject = await this.#datasetContext.propertyVariantId?.(alias) ?? undefined; + this._observePropertyVariant?.destroy(); + if(variantIdSubject) { + this._observePropertyVariant = this.observe( + variantIdSubject, + (variantId) => { + this.#variantId.next(variantId); + } + ); + } + + // TODO: Verify if we need to optimize runtime by parsing the propertyVariantID, cause this method retrieves it again: + const subject = await this.#datasetContext.propertyValueByAlias(alias) + + this._observePropertyValue?.destroy(); + if(subject) { + this._observePropertyValue = this.observe( + subject, + (value) => { + // Note: Do not try to compare new / old value, as it can of any type. We trust the UmbObjectState in doing such. + this.#data.update({ value }); + } + ); + } + } + private _generateVariantDifferenceString() { + if(!this.#datasetContext) return; + const datasetVariantId = this.#datasetContext.getVariantId?.() ?? undefined; this._variantDifference.next( - this.#workspaceVariantId ? this.#variantId.getValue()?.toDifferencesString(this.#workspaceVariantId) : '' + datasetVariantId ? this.#variantId.getValue()?.toDifferencesString(datasetVariantId) : '' ); } @@ -101,17 +119,12 @@ export class UmbWorkspacePropertyContext { public setDescription(description: WorkspacePropertyData['description']) { this.#data.update({ description }); } - public setValue(value: WorkspacePropertyData['value']) { - // Note: Do not try to compare new / old value, as it can of any type. We trust the UmbObjectState in doing such. - this.#data.update({ value }); - } + // TODO: Refactor: consider rename to setValue: public changeValue(value: WorkspacePropertyData['value']) { - this.setValue(value); - const alias = this.#data.getValue().alias; - if (alias) { - this._workspaceContext?.setPropertyValue(alias, value, this.#variantId.getValue()); - } + if (!this.#datasetContext || !alias) return; + + this.#datasetContext?.setPropertyValue(alias, value); } public setConfig(config: WorkspacePropertyData['config'] | undefined) { this.#data.update({ config }); @@ -124,7 +137,7 @@ export class UmbWorkspacePropertyContext { } public resetValue() { - this.setValue(null); // TODO: We should get the default value from Property Editor maybe even later the DocumentType, as that would hold the default value for the property. + this.changeValue(null); // TODO: We should get the default value from Property Editor maybe even later the DocumentType, as that would hold the default value for the property. } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts index e397f079d4..383eee5ad2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts @@ -66,18 +66,6 @@ export class UmbWorkspacePropertyElement extends UmbLitElement { this._observePropertyEditorUI(); } - /** - * Property Value, this is the value stored in the property. - * @public - * @type {unknown} - * @attr - * @default undefined - */ - @property({ attribute: false }) - public set value(value: unknown) { - this._propertyContext.setValue(value); - } - /** * Config. Configuration to pass to the Property Editor UI. This is also the configuration data stored on the Data Type. * @public @@ -90,19 +78,6 @@ export class UmbWorkspacePropertyElement extends UmbLitElement { this._propertyContext.setConfig(value); } - /** - * PropertyVariantId. A Variant ID to identify which variant its value is stored on. - * @public - * @type {UmbVariantId} - * @attr - * @default null - */ - @property({ type: Object, attribute: false }) - public set propertyVariantId(value: UmbVariantId | undefined) { - this._propertyContext.setVariantId(value); - //this._variantDisplayName = value?.toString(); - } - @state() private _variantDifference?: string; @@ -234,8 +209,9 @@ export class UmbWorkspacePropertyElement extends UmbLitElement { ? html`` + .propertyAlias=${this._alias} + .propertyEditorUiAlias=${this._propertyEditorUiAlias} + .value=${this._value}>` : ''}`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts index d8c622df56..ad96924c55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts @@ -43,6 +43,7 @@ export class UmbVariantablePropertyElement extends UmbLitElement { } private _updatePropertyVariantId() { + console.log("_updatePropertyVariantId", this._workspaceVariantId && this.property) if (this._workspaceVariantId && this.property) { const newVariantId = UmbVariantId.Create({ culture: this.property.variesByCulture ? this._workspaceVariantId.culture : null, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts index f080fb5916..0787142510 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts @@ -25,8 +25,8 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { #index = new UmbNumberState(undefined); index = this.#index.asObservable(); - #variantId = new UmbClassState(undefined); - variantId = this.#variantId.asObservable(); + //#variantId = new UmbClassState(undefined); + //variantId = this.#variantId.asObservable(); constructor(host: UmbControllerHost) { super(host); @@ -60,10 +60,13 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { // TODO: Ask workspace context to create the specific dataset. this.#dataSetContext?.destroy(); - const variantId = this.#variantId.getValue(); - if(variantId) { - this.#dataSetContext = this.#workspaceContext?.createVariableDatasetContext(this, UmbVariantId.Create(activeVariantInfo)); - } + const variantId = UmbVariantId.Create(activeVariantInfo); + // We can safely assume in this context that the workspace is variant. + //if(variantId.isInvariant()) { + this.#dataSetContext = this.#workspaceContext?.createVariableDatasetContext(this, variantId); + /*} else { + this.#dataSetContext = this.#workspaceContext?.createDatasetContext(this); + }*/ }, '_observeActiveVariant' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts index a6870731af..36b27a36ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts @@ -1,6 +1,7 @@ import { UmbDocumentWorkspaceContext } from "../workspace/index.js"; import { DocumentVariantResponseModel, PropertyTypeModelBaseModel } from "@umbraco-cms/backoffice/backend-api"; import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; +import { map } from "@umbraco-cms/backoffice/external/rxjs"; import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; import { UMB_DATASET_CONTEXT, UmbVariantDatasetContext } from "@umbraco-cms/backoffice/workspace"; @@ -66,11 +67,20 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV }); } + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async propertyVariantId(propertyAlias: string) { + return (await this.#workspace.structure.propertyStructureByAlias(propertyAlias)).pipe(map((property) => property ? this.#createPropertyVariantId(property) : undefined)); + } + /** * TODO: Write proper JSDocs here. * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. */ async propertyValueByAlias(propertyAlias: string) { + // This is not reacting to if the property variant settings changes while running. const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); if(property) { @@ -82,6 +92,12 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV return undefined; } + // TODO: Refactor: + // Not used currently: + async propertyValueByAliasAndCulture(propertyAlias: string, propertyVariantId: UmbVariantId) { + return this.#workspace.propertyValueByAlias(propertyAlias, propertyVariantId); + } + /** * TODO: Write proper JSDocs here. * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. 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 a01aadcab0..fc51684b6f 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 @@ -1,7 +1,7 @@ import { UmbDocumentRepository } from '../repository/document.repository.js'; import { UmbDocumentTypeRepository } from '../../document-types/repository/document-type.repository.js'; import { UmbDocumentDatasetContext } from '../dataset-context/document-dataset-context.js'; -import { type UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import { UmbSaveableWorkspaceContextInterface, @@ -203,6 +203,10 @@ export class UmbDocumentWorkspaceContext return new UmbDocumentDatasetContext(host, this, variantId); } + public createDatasetContext(host: UmbControllerHost): UmbDatasetContext { + return new UmbDocumentDatasetContext(host, this, UmbVariantId.Create({})); + } + public destroy(): void { this.#currentData.complete(); this.structure.destroy(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts index 86779efde4..5e323458f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts @@ -42,7 +42,7 @@ export class UmbDocumentWorkspaceViewEditPropertiesElement extends UmbLitElement return repeat( this._propertyStructure, (property) => property.alias, - (property) => html` ` + (property) => html` ` ); } From 07724b779d576dfd312234a051a9400f3bbd112d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Sun, 27 Aug 2023 20:51:28 +0200 Subject: [PATCH 36/75] split-view folder name --- .../src/packages/core/workspace/index.ts | 2 +- .../index.ts | 1 - .../workspace-split-view.context.ts | 0 .../workspace-split-view.element.ts | 0 .../variantable-property.element.ts | 78 ------------------- .../variantable-property.stories.ts | 30 ------- 6 files changed, 1 insertion(+), 110 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/{workspace-variant => workspace-split-view}/index.ts (58%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/{workspace-variant => workspace-split-view}/workspace-split-view.context.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/{workspace-variant => workspace-split-view}/workspace-split-view.element.ts (100%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.stories.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 d25134ee36..da8ba5fdeb 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 @@ -10,4 +10,4 @@ export * from './workspace-modal/index.js'; export * from './workspace-property-layout/workspace-property-layout.element.js'; export * from './workspace-property/index.js'; export * from './workspace-split-view-manager.class.js'; -export * from './workspace-variant/index.js'; +export * from './workspace-split-view/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/index.ts similarity index 58% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/index.ts index afbed12d8a..1312849754 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/index.ts @@ -1,3 +1,2 @@ -export * from './variantable-property/variantable-property.element.js'; export * from './workspace-split-view.context.js'; export * from './workspace-split-view.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts deleted file mode 100644 index ad96924c55..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT } from '../workspace-split-view.context.js'; -import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import type { PropertyTypeModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; - -@customElement('umb-variantable-property') -export class UmbVariantablePropertyElement extends UmbLitElement { - private _property?: PropertyTypeModelBaseModel | undefined; - @property({ type: Object, attribute: false }) - public get property(): PropertyTypeModelBaseModel | undefined { - return this._property; - } - public set property(property: PropertyTypeModelBaseModel | undefined) { - this._property = property; - this._updatePropertyVariantId(); - } - - private _variantContext?: typeof UMB_WORKSPACE_SPLIT_VIEW_CONTEXT.TYPE; - - @state() - private _workspaceVariantId?: UmbVariantId; - - @state() - private _propertyVariantId?: UmbVariantId; - - constructor() { - super(); - // TODO: Refactor: this could use the new DataSetContext: - this.consumeContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, (workspaceContext) => { - this._variantContext = workspaceContext; - this._observeVariantContext(); - }); - } - - private _observeVariantContext() { - if (!this._variantContext || !this.property) return; - this.observe(this._variantContext.variantId, (variantId) => { - this._workspaceVariantId = variantId; - this._updatePropertyVariantId(); - }); - } - - private _updatePropertyVariantId() { - console.log("_updatePropertyVariantId", this._workspaceVariantId && this.property) - if (this._workspaceVariantId && this.property) { - const newVariantId = UmbVariantId.Create({ - culture: this.property.variesByCulture ? this._workspaceVariantId.culture : null, - segment: this.property.variesBySegment ? this._workspaceVariantId.segment : null, - }); - if (!this._propertyVariantId || !newVariantId.equal(this._propertyVariantId)) { - this._propertyVariantId = newVariantId; - } - } - } - - render() { - return html``; - } - - static styles = [ - UUITextStyles, - css` - :host { - display: block; - } - `, - ]; -} - -declare global { - interface HTMLElementTagNameMap { - 'umb-variantable-property': UmbVariantablePropertyElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.stories.ts deleted file mode 100644 index 9bb61ac331..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.stories.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Meta, StoryObj } from '@storybook/web-components'; -import './variantable-property.element.js'; -import type { UmbVariantablePropertyElement } from './variantable-property.element.js'; - -const meta: Meta = { - title: 'Components/Variantable Property', - component: 'umb-variantable-property', -}; - -export default meta; -type Story = StoryObj; - -export const Overview: Story = { - args: { - property: { - name: 'Header', - alias: 'headerAlias', - appearance: { - labelOnTop: false, - }, - description: 'This is a description', - variesByCulture: true, - variesBySegment: true, - validation: { - mandatory: true, - mandatoryMessage: 'This is a mandatory message', - }, - }, - }, -}; From 9b02f0f5e1e7cb6367511ee41e74650c113d988f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Sun, 27 Aug 2023 21:06:40 +0200 Subject: [PATCH 37/75] UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN --- .../variant-dataset-context.interface.ts | 2 +- .../core/workspace/workspace-context/index.ts | 13 ++- .../variant-workspace-context.token.ts | 9 ++ ...e-variantable-entity-context.interface.ts} | 2 +- .../workspace-split-view.context.ts | 12 +- .../workspace-split-view.context.ts | 108 ++++++++++++++++++ .../workspace/document-workspace.context.ts | 4 +- 7 files changed, 133 insertions(+), 17 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/variant-workspace-context.token.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/{workspace-variable-entity-context.interface.ts => workspace-variantable-entity-context.interface.ts} (91%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts index f1d92fdd32..8eb2a0b20b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts @@ -3,5 +3,5 @@ import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; export interface UmbVariantDatasetContext extends UmbDatasetContext { - getVariantId: () => UmbVariantId | undefined; + getVariantId: () => UmbVariantId; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts index b20e7ca65a..a4a0b81910 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts @@ -1,9 +1,10 @@ export * from './entity-manager-controller.js'; -export * from './workspace-context.js'; -export * from './workspace-context.interface.js'; -export * from './saveable-workspace-context.interface.js'; -export * from './publishable-workspace-context.interface.js'; export * from './property-structure-workspace-context.interface.js'; -export * from './workspace-invariable-entity-context.interface.js'; -export * from './workspace-variable-entity-context.interface.js'; +export * from './publishable-workspace-context.interface.js'; +export * from './saveable-workspace-context.interface.js'; +export * from './variant-workspace-context.token.js'; +export * from './workspace-context.interface.js'; +export * from './workspace-context.js'; export * from './workspace-context.token.js'; +export * from './workspace-invariable-entity-context.interface.js'; +export * from './workspace-variantable-entity-context.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/variant-workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/variant-workspace-context.token.ts new file mode 100644 index 0000000000..ea257cc630 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/variant-workspace-context.token.ts @@ -0,0 +1,9 @@ +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import type { UmbVariantableWorkspaceContextInterface } from './workspace-variantable-entity-context.interface.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; + +export const UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN = new UmbContextToken, UmbVariantableWorkspaceContextInterface>( + 'UmbWorkspaceContext', + (context): context is UmbVariantableWorkspaceContextInterface => 'variants' in context, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-entity-context.interface.ts similarity index 91% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-entity-context.interface.ts index 212e79229c..d367113e81 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-entity-context.interface.ts @@ -6,7 +6,7 @@ import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { ValueModelBaseModel, VariantResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export interface UmbVariableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { +export interface UmbVariantableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { variants: Observable>; splitView: UmbWorkspaceSplitViewManager; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index 0787142510..a79fdf84f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -1,20 +1,19 @@ -import { UmbVariableWorkspaceContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; -import { UMB_WORKSPACE_CONTEXT } from '../workspace-context/workspace-context.token.js'; +import { UmbVariantableWorkspaceContextInterface } from '../workspace-context/workspace-variantable-entity-context.interface.js'; import { UmbDatasetContext } from '../dataset-context/index.js'; +import { UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN } from '../index.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContextToken, } from '@umbraco-cms/backoffice/context-api'; import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { - UmbClassState, UmbNumberState, } from '@umbraco-cms/backoffice/observable-api'; export class UmbWorkspaceSplitViewContext extends UmbBaseController { - #workspaceContext?: UmbVariableWorkspaceContextInterface; + #workspaceContext?: typeof UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN.TYPE; public getWorkspaceContext() { return this.#workspaceContext; } @@ -31,9 +30,8 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { constructor(host: UmbControllerHost) { super(host); - // TODO: Make a UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN, and interface for such. - this.consumeContext(UMB_WORKSPACE_CONTEXT, (context) => { - this.#workspaceContext = context as UmbVariableWorkspaceContextInterface; + this.consumeContext(UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN, (context) => { + this.#workspaceContext = context; this._observeVariant(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts new file mode 100644 index 0000000000..7727926401 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts @@ -0,0 +1,108 @@ +import { UmbDatasetContext } from '../dataset-context/index.js'; +import { UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN } from '../index.js'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { + UmbContextToken, +} from '@umbraco-cms/backoffice/context-api'; +import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { + UmbNumberState, +} from '@umbraco-cms/backoffice/observable-api'; + + +export class UmbWorkspaceSplitViewContext extends UmbBaseController { + + #workspaceContext?: typeof UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN.TYPE; + public getWorkspaceContext() { + return this.#workspaceContext; + } + + // TODO: Refactor: use a variable data set context interface here. + #dataSetContext?: UmbDatasetContext; + + #index = new UmbNumberState(undefined); + index = this.#index.asObservable(); + + constructor(host: UmbControllerHost) { + super(host); + + this.consumeContext(UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN, (context) => { + this.#workspaceContext = context; + this._observeVariant(); + }); + + this.observe(this.#index, () => { + this._observeVariant(); + }); + + + this.provideContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, this); + } + + private _observeVariant() { + if (!this.#workspaceContext) return; + + const index = this.#index.getValue(); + if (index === undefined) return; + + // TODO: Should splitView be put into its own context?... a split view manager context? one which might have a reference to the workspace context, so we still can ask that about how to create the dataset context. + this.observe( + this.#workspaceContext.splitView.activeVariantByIndex(index), + async (activeVariantInfo) => { + if (!activeVariantInfo) return; + + // TODO: Ask workspace context to create the specific dataset. + + this.#dataSetContext?.destroy(); + const variantId = UmbVariantId.Create(activeVariantInfo); + // We can safely assume in this context that the workspace is variant. + //if(variantId.isInvariant()) { + this.#dataSetContext = this.#workspaceContext?.createVariableDatasetContext(this, variantId); + /*} else { + this.#dataSetContext = this.#workspaceContext?.createDatasetContext(this); + }*/ + }, + '_observeActiveVariant' + ); + } + + + public switchVariant(variant: UmbVariantId) { + const index = this.#index.value; + if (index === undefined) return; + this.#workspaceContext?.splitView.switchVariant(index, variant); + } + + public closeSplitView() { + const index = this.#index.value; + if (index === undefined) return; + this.#workspaceContext?.splitView.closeSplitView(index); + } + + public openSplitView(variant: UmbVariantId) { + this.#workspaceContext?.splitView.openSplitView(variant); + } + + public changeVariant(culture: string | null, segment: string | null) { + const index = this.#index.getValue(); + if (index === undefined) return; + this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); + } + + public getSplitViewIndex() { + return this.#index.getValue(); + } + public setSplitViewIndex(index: number) { + this.#index.next(index); + } + + + /** + * + * concept this class could have methods to set and get the culture and segment of the active variant? just by using the index. + */ +} + +export const UMB_WORKSPACE_SPLIT_VIEW_CONTEXT = new UmbContextToken( + 'umbWorkspaceSplitViewContext' +); 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 fc51684b6f..e96a010944 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 @@ -7,7 +7,7 @@ import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceSplitViewManager, - UmbVariableWorkspaceContextInterface, + UmbVariantableWorkspaceContextInterface, type UmbDatasetContext, } from '@umbraco-cms/backoffice/workspace'; import type { CreateDocumentRequestModel, DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -27,7 +27,7 @@ import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; type EntityType = DocumentResponseModel; export class UmbDocumentWorkspaceContext extends UmbWorkspaceContext - implements UmbVariableWorkspaceContextInterface + implements UmbVariantableWorkspaceContextInterface { /** * The document is the current stored version of the document. From 3cb6cfbf66804e26d6a01531298a81501f183439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Sun, 27 Aug 2023 22:21:51 +0200 Subject: [PATCH 38/75] data-type workspace using dataset --- .../property-editor-config.element.ts | 83 ++++-------------- .../dataset-context.interface.ts | 6 +- .../core/workspace/workspace-context/index.ts | 4 +- .../saveable-workspace-context.interface.ts | 6 -- .../variant-workspace-context.token.ts | 2 +- ...workspace-invariable-context.interface.ts} | 12 ++- ...orkspace-variantable-context.interface.ts} | 13 +-- .../workspace-split-view.context.ts | 2 +- .../document-dataset-context.ts | 7 ++ .../data-type-dataset-context.ts | 68 +++++++++++++++ .../src/packages/settings/data-types/index.ts | 1 + .../workspace/data-type-workspace.context.ts | 84 ++++++++++++++++++- ...ata-type-details-workspace-view.element.ts | 6 +- 13 files changed, 199 insertions(+), 95 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/{workspace-invariable-entity-context.interface.ts => workspace-invariable-context.interface.ts} (58%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/{workspace-variantable-entity-context.interface.ts => workspace-variantable-context.interface.ts} (94%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 903cd08b28..4b2bf3ba24 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -1,3 +1,4 @@ +import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from '../../../settings/data-types/workspace/data-type-workspace.context.js'; import { html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { @@ -8,6 +9,7 @@ import { import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT } from '@umbraco-cms/backoffice/property-editor'; +import { UMB_DATASET_CONTEXT } from '@umbraco-cms/backoffice/workspace'; /** * @element umb-property-editor-config @@ -15,23 +17,8 @@ import { UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT } from '@umbraco-cms/backoffic */ @customElement('umb-property-editor-config') export class UmbPropertyEditorConfigElement extends UmbLitElement { - /** - * Property Editor UI Alias. The element will render configuration for a Property Editor UI with this alias. - * @type {string} - * @attr - * @default '' - */ - private _propertyEditorUiAlias = ''; - @property({ type: String, attribute: 'property-editor-ui-alias' }) - public get propertyEditorUiAlias(): string { - return this._propertyEditorUiAlias; - } - public set propertyEditorUiAlias(value: string) { - const oldVal = this._propertyEditorUiAlias; - this._propertyEditorUiAlias = value; - this.requestUpdate('propertyEditorUiAlias', oldVal); - this._observePropertyEditorUIConfig(); - } + + #datasetContext?: typeof UMB_DATASET_CONTEXT.TYPE; /** * Data. The element will render configuration editors with values from this data. @@ -46,64 +33,27 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { @state() private _properties: Array = []; - private _propertyEditorSchemaConfigDefaultData: Array = []; - private _propertyEditorUISettingsDefaultData: Array = []; - private _configDefaultData?: Array; + constructor() { + super(); - private _propertyEditorSchemaConfigProperties: Array = []; - private _propertyEditorUISettingsProperties: Array = []; + this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.#datasetContext = instance.createDatasetContext(this); + this.observe(this.#datasetContext.properties, (properties) => { + this._properties = properties; + }, 'observeProperties'); + }); - private _observePropertyEditorUIConfig() { - if (!this._propertyEditorUiAlias) return; - - this.observe( - umbExtensionsRegistry.getByTypeAndAlias('propertyEditorUi', this.propertyEditorUiAlias), - (manifest) => { - this._observePropertyEditorSchemaConfig( - manifest?.meta.propertyEditorSchemaAlias || UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT - ); - this._propertyEditorUISettingsProperties = manifest?.meta.settings?.properties || []; - this._propertyEditorUISettingsDefaultData = manifest?.meta.settings?.defaultData || []; - this._mergeConfigProperties(); - this._mergeConfigDefaultData(); - } - ); - } - - private _observePropertyEditorSchemaConfig(propertyEditorSchemaAlias: string) { - this.observe( - umbExtensionsRegistry.getByTypeAndAlias('propertyEditorSchema', propertyEditorSchemaAlias), - (manifest) => { - this._propertyEditorSchemaConfigProperties = manifest?.meta.settings?.properties || []; - this._propertyEditorSchemaConfigDefaultData = manifest?.meta.settings?.defaultData || []; - this._mergeConfigProperties(); - this._mergeConfigDefaultData(); - } - ); - } - - private _mergeConfigProperties() { - this._properties = [...this._propertyEditorSchemaConfigProperties, ...this._propertyEditorUISettingsProperties]; - } - - private _mergeConfigDefaultData() { - this._configDefaultData = [ - ...this._propertyEditorSchemaConfigDefaultData, - ...this._propertyEditorUISettingsDefaultData, - ]; } /** * Get the stored value for a property. It will render the default value from the configuration if no value is stored in the database. */ // TODO: Refactor: setup a dataset for this, otherwise we cannot ensure features, neither the right reactivity. - private _getValue(property: PropertyEditorConfigProperty) { - const value = this.data.find((data) => data.alias === property.alias)?.value; - if (value) return value; - const defaultValue = this._configDefaultData?.find((data) => data.alias === property.alias)?.value; - return defaultValue ?? null; - } + // TODO: Refactor: move the default data and getting the property config etc. to the workspace. + /** + Create a dataset context for this one. Feed if with fallback/default values. + */ render() { return html` @@ -116,7 +66,6 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { description="${ifDefined(property.description)}" alias="${property.alias}" property-editor-ui-alias="${property.propertyEditorUiAlias}" - .value=${this._getValue(property)} .config=${property.config}> ` )} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts index 33576b4fce..d685ff1d6d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts @@ -19,7 +19,7 @@ export interface UmbDatasetContext { getType(): string; getUnique(): string | undefined; //getUniqueName(): string; - getVariantId: undefined | (() => UmbVariantId | undefined); + getVariantId?: (() => UmbVariantId | undefined); getName(): string | undefined; readonly name: Observable; @@ -27,8 +27,8 @@ export interface UmbDatasetContext { destroy(): void; // Property methods: - propertyVariantId(propertyAlias: string): Promise | undefined>; - propertyValueByAlias(propertyAlias: string): Promise | undefined>; + propertyVariantId?: ((propertyAlias: string) => Promise>); + propertyValueByAlias(propertyAlias: string): Promise>; setPropertyValue(propertyAlias: string, value: unknown): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts index a4a0b81910..168dde8a10 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts @@ -6,5 +6,5 @@ export * from './variant-workspace-context.token.js'; export * from './workspace-context.interface.js'; export * from './workspace-context.js'; export * from './workspace-context.token.js'; -export * from './workspace-invariable-entity-context.interface.js'; -export * from './workspace-variantable-entity-context.interface.js'; +export * from './workspace-invariable-context.interface.js'; +export * from './workspace-variantable-context.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts index ad051d09a8..289e233fa5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts @@ -1,13 +1,7 @@ -import { UmbDatasetContext } from '../dataset-context/dataset-context.interface.js'; import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbSaveableWorkspaceContextInterface extends UmbWorkspaceContextInterface { //getData(): EntityType | undefined; save(): Promise; - - - // Dataset methods: - createDatasetContext(host: UmbControllerHost): UmbDatasetContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/variant-workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/variant-workspace-context.token.ts index ea257cc630..7c0a70e7a1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/variant-workspace-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/variant-workspace-context.token.ts @@ -1,5 +1,5 @@ import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; -import type { UmbVariantableWorkspaceContextInterface } from './workspace-variantable-entity-context.interface.js'; +import type { UmbVariantableWorkspaceContextInterface } from './workspace-variantable-context.interface.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts similarity index 58% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts index 8ce5b98c49..a7afc253a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts @@ -1,14 +1,22 @@ +import type { UmbDatasetContext } from '../dataset-context/dataset-context.interface.js'; import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { ValueModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbInvariableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { - getName(): void; + + // Name: + getName(): string | undefined; setName(name: string): void; + // Property: propertyDataById(id: string): Observable; - propertyValueByAlias(alias: string): Observable; + propertyValueByAlias(alias: string): Observable; getPropertyValue(alias: string): void; setPropertyValue(alias: string, value: unknown): void; + + // Dataset methods: + createDatasetContext(host: UmbControllerHost): UmbDatasetContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-entity-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts index d367113e81..0575a7ba3a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-entity-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts @@ -7,22 +7,23 @@ import type { ValueModelBaseModel, VariantResponseModelBaseModel } from '@umbrac import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbVariantableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { - variants: Observable>; - splitView: UmbWorkspaceSplitViewManager; - - getName(variantId?: UmbVariantId): void; + // Name: + getName(variantId?: UmbVariantId): string | undefined; setName(name: string, variantId?: UmbVariantId): void; + // Variant: + variants: Observable>; + splitView: UmbWorkspaceSplitViewManager; getVariant(variantId: UmbVariantId): VariantResponseModelBaseModel | undefined; - //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; - + // Property: // This one is async cause it needs to structure to provide this data: propertyDataById(id: string): Promise>; propertyValueByAlias(alias: string, variantId?: UmbVariantId): Observable; getPropertyValue(alias: string, variantId?: UmbVariantId): void; setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId): void; + //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; // Dataset methods: createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbDatasetContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index a79fdf84f3..64b141ed37 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -1,4 +1,4 @@ -import { UmbVariantableWorkspaceContextInterface } from '../workspace-context/workspace-variantable-entity-context.interface.js'; +import { UmbVariantableWorkspaceContextInterface } from '../workspace-context/workspace-variantable-context.interface.js'; import { UmbDatasetContext } from '../dataset-context/index.js'; import { UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN } from '../index.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts index 36b27a36ad..a59e6fc388 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts @@ -21,6 +21,9 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV culture = this.#currentVariant.asObservablePart((x) => x?.culture); segment = this.#currentVariant.asObservablePart((x) => x?.segment); + // TODO: Refactor: Make a properties observable. (with such I think i mean a property value object array.. array with object with properties, alias, value, culture and segment) + + getType(): string { return this.#workspace.getEntityType(); @@ -81,6 +84,9 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV */ async propertyValueByAlias(propertyAlias: string) { + return (await this.#workspace.structure.propertyStructureByAlias(propertyAlias)).pipe(map((property) => property?.alias ? this.#workspace.getPropertyValue(property.alias, this.#createPropertyVariantId(property)) : undefined)); + + /* // This is not reacting to if the property variant settings changes while running. const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); if(property) { @@ -90,6 +96,7 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV } } return undefined; + */ } // TODO: Refactor: diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts new file mode 100644 index 0000000000..6c019e6780 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts @@ -0,0 +1,68 @@ +import { UmbDataTypeWorkspaceContext } from "../workspace/data-type-workspace.context.js"; +import { DocumentVariantResponseModel } from "@umbraco-cms/backoffice/backend-api"; +import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; +import { PropertyEditorConfigProperty } from "@umbraco-cms/backoffice/extension-registry"; +import { Observable } from "@umbraco-cms/backoffice/external/rxjs"; +import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; +import { UMB_DATASET_CONTEXT, UmbDatasetContext } from "@umbraco-cms/backoffice/workspace"; + +export class UmbDataTypeDatasetContext extends UmbBaseController implements UmbDatasetContext { + + #workspace: UmbDataTypeWorkspaceContext; + + #currentVariant = new UmbObjectState(undefined); + currentVariant = this.#currentVariant.asObservable(); + + name = this.#currentVariant.asObservablePart((x) => x?.name); + culture = this.#currentVariant.asObservablePart((x) => x?.culture); + segment = this.#currentVariant.asObservablePart((x) => x?.segment); + + properties: Observable>; + + // default data: + + + getType(): string { + return this.#workspace.getEntityType(); + } + getUnique(): string | undefined { + return this.#workspace.getEntityId(); + } + getName(): string | undefined { + return this.#workspace.getName(); + } + setName(name: string) { + this.#workspace.setName(name); + } + + + + constructor(host: UmbControllerHost, workspace: UmbDataTypeWorkspaceContext) { + // The controller alias, is a very generic name cause we want only one of these for this controller host. + super(host, 'dataSetContext'); + this.#workspace = workspace; + + this.properties = this.#workspace.properties; + + // TODO: Refactor: use the document dataset context token. + this.provideContext(UMB_DATASET_CONTEXT, this); + } + + + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async propertyValueByAlias(propertyAlias: string) { + return this.#workspace.propertyValueByAlias(propertyAlias); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async setPropertyValue(propertyAlias: string, value: unknown) { + return this.#workspace.setPropertyValue(propertyAlias, value); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts index 10ee495e1d..456701c072 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts @@ -3,3 +3,4 @@ import './components/index.js'; export type { UmbDataTypeModel } from './models.js'; export * from './entities.js'; export * from './repository/index.js'; +export * from './dataset-context/data-type-dataset-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index ed2733d10c..8ef557d09e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,13 +1,17 @@ import { UmbDataTypeRepository } from '../repository/data-type.repository.js'; -import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbDataTypeDatasetContext } from '../index.js'; +import { UmbDatasetContext, UmbInvariableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import { PropertyEditorConfigDefaultData, PropertyEditorConfigProperty, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT } from '@umbraco-cms/backoffice/property-editor'; export class UmbDataTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbSaveableWorkspaceContextInterface + implements UmbInvariableWorkspaceContextInterface { // TODO: revisit. temp solution because the create and response models are different. #data = new UmbObjectState(undefined); @@ -16,8 +20,72 @@ export class UmbDataTypeWorkspaceContext name = this.#data.asObservablePart((data) => data?.name); id = this.#data.asObservablePart((data) => data?.id); + propertyEditorUiAlias = this.#data.asObservablePart((data) => data?.propertyEditorUiAlias); + propertyEditorSchemaAlias = this.#data.asObservablePart((data) => data?.propertyEditorAlias); + + #properties = new UmbObjectState | undefined>(undefined); + properties: Observable | undefined> = this.#properties.asObservable(); + + private _propertyEditorSchemaConfigDefaultData: Array = []; + private _propertyEditorUISettingsDefaultData: Array = []; + + private _propertyEditorSchemaConfigProperties?: Array; + private _propertyEditorUISettingsProperties?: Array; + + private _configDefaultData?: Array; + constructor(host: UmbControllerHostElement) { super(host, 'Umb.Workspace.DataType', new UmbDataTypeRepository(host)); + + this.observe(this.propertyEditorUiAlias, (propertyEditorUiAlias) => { + if (!propertyEditorUiAlias) return; + + this.observe( + umbExtensionsRegistry.getByTypeAndAlias('propertyEditorUi', propertyEditorUiAlias), + (manifest) => { + this._observePropertyEditorSchemaConfig( + manifest?.meta.propertyEditorSchemaAlias || UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT + ); + this._propertyEditorUISettingsProperties = manifest?.meta.settings?.properties || []; + this._propertyEditorUISettingsDefaultData = manifest?.meta.settings?.defaultData || []; + this._mergeConfigProperties(); + this._mergeConfigDefaultData(); + } + ); + }); + } + + private _observePropertyEditorSchemaConfig(propertyEditorSchemaAlias: string) { + this.observe( + umbExtensionsRegistry.getByTypeAndAlias('propertyEditorSchema', propertyEditorSchemaAlias), + (manifest) => { + this._propertyEditorSchemaConfigProperties = manifest?.meta.settings?.properties || []; + this._propertyEditorSchemaConfigDefaultData = manifest?.meta.settings?.defaultData || []; + this._mergeConfigProperties(); + this._mergeConfigDefaultData(); + } + ); + } + + private _mergeConfigProperties() { + if(this._propertyEditorSchemaConfigProperties && this._propertyEditorUISettingsProperties) { + this.#properties.next([...this._propertyEditorSchemaConfigProperties, ...this._propertyEditorUISettingsProperties]); + } + } + + private _mergeConfigDefaultData() { + this._configDefaultData = [ + ...this._propertyEditorSchemaConfigDefaultData, + ...this._propertyEditorUISettingsDefaultData, + ]; + } + + public getPropertyDefaultValue(alias: string) { + return this._configDefaultData?.find((x) => x.alias === alias)?.value; + } + + createDatasetContext(host: UmbControllerHost): UmbDatasetContext { + return new UmbDataTypeDatasetContext(host, this); } async load(id: string) { @@ -52,6 +120,9 @@ export class UmbDataTypeWorkspaceContext return 'data-type'; } + getName() { + this.#data.getValue()?.name; + } setName(name: string) { this.#data.update({ name }); } @@ -63,6 +134,11 @@ export class UmbDataTypeWorkspaceContext this.#data.update({ propertyEditorUiAlias: alias }); } + + propertyValueByAlias(propertyAlias: string) { + return this.#data.asObservablePart((data) => data?.values?.find((x) => x.alias === propertyAlias)?.value ?? this.getPropertyDefaultValue(propertyAlias) as ReturnType); + } + // TODO: its not called a property in the model, but we do consider this way in our front-end setPropertyValue(alias: string, value: unknown) { const entry = { alias: alias, value: value }; @@ -97,7 +173,7 @@ export class UmbDataTypeWorkspaceContext } } -export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbDataTypeWorkspaceContext => context.getEntityType?.() === 'data-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts index 3b6543ae28..a885b7d34f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts @@ -73,7 +73,7 @@ export class UmbDataTypeDetailsWorkspaceViewEditElement if (!propertyEditorSchema) return; this._setPropertyEditorUiAlias(propertyEditorSchema.meta.defaultPropertyEditorUiAlias ?? undefined); }, - '_observepropertyEditorSchemaForDefaultUI' + '_observePropertyEditorSchemaForDefaultUI' ); } else { this._setPropertyEditorUiAlias(undefined); @@ -103,8 +103,8 @@ export class UmbDataTypeDetailsWorkspaceViewEditElement return; } - // remove the '_observepropertyEditorSchemaForDefaultUI' controller, as we do not want to observe for default value anymore: - this.removeControllerByAlias('_observepropertyEditorSchemaForDefaultUI'); + // remove the '_observePropertyEditorSchemaForDefaultUI' controller, as we do not want to observe for default value anymore: + this.removeControllerByAlias('_observePropertyEditorSchemaForDefaultUI'); this.observe( umbExtensionsRegistry.getByTypeAndAlias('propertyEditorUi', propertyEditorUiAlias), From 973dcf51e5a9556821de063604f6e6ca253fe7a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 12:26:16 +0200 Subject: [PATCH 39/75] datatype editor reactive corrections --- .../property-editor-config.element.ts | 10 ++-- .../dataset-context.interface.ts | 2 +- ...y-structure-workspace-context.interface.ts | 4 +- .../workspace-invariable-context.interface.ts | 8 +-- ...workspace-variantable-context.interface.ts | 9 ++- .../workspace-property.context.ts | 4 ++ .../document-dataset-context.ts | 17 +----- .../workspace/document-workspace.context.ts | 33 +++++++---- .../data-type-dataset-context.ts | 4 +- .../workspace/data-type-workspace.context.ts | 56 +++++++++++++++---- 10 files changed, 89 insertions(+), 58 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 4b2bf3ba24..2b631df5b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -2,14 +2,11 @@ import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from '../../../settings/data-types/wo import { html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { - PropertyEditorConfigDefaultData, PropertyEditorConfigProperty, - umbExtensionsRegistry, } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT } from '@umbraco-cms/backoffice/property-editor'; -import { UMB_DATASET_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UmbDataTypeDatasetContext } from '@umbraco-cms/backoffice/data-type'; /** * @element umb-property-editor-config @@ -18,7 +15,7 @@ import { UMB_DATASET_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-property-editor-config') export class UmbPropertyEditorConfigElement extends UmbLitElement { - #datasetContext?: typeof UMB_DATASET_CONTEXT.TYPE; + #datasetContext?: UmbDataTypeDatasetContext; /** * Data. The element will render configuration editors with values from this data. @@ -38,9 +35,10 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { super(); this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (instance) => { + console.log("config got context, but has already?...", this.#datasetContext) this.#datasetContext = instance.createDatasetContext(this); this.observe(this.#datasetContext.properties, (properties) => { - this._properties = properties; + this._properties = properties as Array; }, 'observeProperties'); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts index d685ff1d6d..f3554750dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts @@ -1,5 +1,5 @@ -import type { Observable } from "@umbraco-cms/backoffice/external/rxjs"; import type { UmbVariantId } from "../../variant/variant-id.class.js"; +import type { Observable } from "@umbraco-cms/backoffice/external/rxjs"; /** * Represents a set of properties. diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts index 64fa491da9..e0698d4cf6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts @@ -1,8 +1,10 @@ import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; +import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import type { ValueModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; export interface UmbPropertyStructureWorkspaceContextInterface extends UmbWorkspaceContextInterface { - + propertyDataById(id: string): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts index a7afc253a2..a87a58d4bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts @@ -1,7 +1,6 @@ import type { UmbDatasetContext } from '../dataset-context/dataset-context.interface.js'; import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import type { ValueModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbInvariableWorkspaceContextInterface @@ -12,10 +11,9 @@ export interface UmbInvariableWorkspaceContextInterface setName(name: string): void; // Property: - propertyDataById(id: string): Observable; - propertyValueByAlias(alias: string): Observable; - getPropertyValue(alias: string): void; - setPropertyValue(alias: string, value: unknown): void; + propertyValueByAlias(alias: string): Promise>; + getPropertyValue(alias: string): ReturnType; + setPropertyValue(alias: string, value: unknown): Promise; // Dataset methods: createDatasetContext(host: UmbControllerHost): UmbDatasetContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts index 0575a7ba3a..ed56862923 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts @@ -3,7 +3,7 @@ import type { UmbDatasetContext } from '../dataset-context/dataset-context.inter import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import type { ValueModelBaseModel, VariantResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { VariantResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbVariantableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { @@ -19,10 +19,9 @@ export interface UmbVariantableWorkspaceContextInterface e // Property: // This one is async cause it needs to structure to provide this data: - propertyDataById(id: string): Promise>; - propertyValueByAlias(alias: string, variantId?: UmbVariantId): Observable; - getPropertyValue(alias: string, variantId?: UmbVariantId): void; - setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId): void; + propertyValueByAlias(alias: string, variantId?: UmbVariantId): Promise>; + getPropertyValue(alias: string, variantId?: UmbVariantId): ReturnValue | undefined; + setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId): Promise; //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; // Dataset methods: diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts index 6147f53c48..602f1690e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts @@ -58,6 +58,10 @@ export class UmbWorkspacePropertyContext extends UmbBaseControl this._observeProperty(); }); + this.observe(this.alias, () => { + this._observeProperty(); + }); + this._providerController = new UmbContextProviderController(host, UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, this); this.observe(this.configValues, (configValues) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts index a59e6fc388..e02c8ca30f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts @@ -83,24 +83,11 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. */ async propertyValueByAlias(propertyAlias: string) { - + await this.#workspace.isLoaded(); return (await this.#workspace.structure.propertyStructureByAlias(propertyAlias)).pipe(map((property) => property?.alias ? this.#workspace.getPropertyValue(property.alias, this.#createPropertyVariantId(property)) : undefined)); - - /* - // This is not reacting to if the property variant settings changes while running. - const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); - if(property) { - const variantId = this.#createPropertyVariantId(property); - if(property.alias) { - return this.#workspace.propertyValueByAlias(property.alias, variantId); - } - } - return undefined; - */ } - // TODO: Refactor: - // Not used currently: + // TODO: Refactor: Not used currently, but should investigate if we can implement this, to spare some energy. async propertyValueByAliasAndCulture(propertyAlias: string, propertyVariantId: UmbVariantId) { return this.#workspace.propertyValueByAlias(propertyAlias, propertyVariantId); } 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 e96a010944..31d966f05a 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 @@ -19,10 +19,6 @@ import { } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; - -// TODO: should this context be called DocumentDraft instead of workspace? or should the draft be part of this? -// TODO: Should we have a DocumentStructureContext and maybe even a DocumentDraftContext? type EntityType = DocumentResponseModel; export class UmbDocumentWorkspaceContext @@ -40,6 +36,11 @@ export class UmbDocumentWorkspaceContext * The document is the current state/draft version of the document. */ #currentData = new UmbObjectState(undefined); + #getDataPromise?: Promise; + public isLoaded() { + return this.#getDataPromise; + } + readonly unique = this.#currentData.asObservablePart((data) => data?.id); readonly documentTypeKey = this.#currentData.asObservablePart((data) => data?.contentTypeId); @@ -64,7 +65,8 @@ export class UmbDocumentWorkspaceContext } async load(entityId: string) { - const { data } = await this.repository.requestById(entityId); + this.#getDataPromise = this.repository.requestById(entityId); + const { data } = await this.#getDataPromise; if (!data) return undefined; this.setIsNew(false); @@ -74,7 +76,8 @@ export class UmbDocumentWorkspaceContext } async create(documentTypeKey: string, parentId: string | null) { - const { data } = await this.repository.createScaffold(documentTypeKey, { parentId }); + this.#getDataPromise = this.repository.createScaffold(documentTypeKey, { parentId }); + const { data } = await this.#getDataPromise; if (!data) return undefined; this.setIsNew(true); @@ -132,28 +135,34 @@ export class UmbDocumentWorkspaceContext this.#currentData.update({ variants }); } - propertyDataById(propertyId: string) { + async propertyDataById(propertyId: string) { return this.structure.propertyStructureById(propertyId); } - propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId): Observable { + async propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId) { return this.#currentData.asObservablePart( (data) => - data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))?.value + data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))?.value as PropertyValueType ); } - getPropertyValue(alias: string, variantId?: UmbVariantId): PropertyValueType | undefined { + /** + * Get the current value of the property with the given alias and variantId. + * @param alias + * @param variantId + * @returns The value or undefined if not set or found. + */ + getPropertyValue(alias: string, variantId?: UmbVariantId) { const currentData = this.#currentData.value; if (currentData) { const newDataSet = currentData.values?.find( (x) => x.alias === alias && (variantId ? variantId.compare(x) : true) ); - return newDataSet?.value; + return newDataSet?.value as ReturnType; } return undefined; } - setPropertyValue(alias: string, value: PropertyValueType, variantId?: UmbVariantId) { + async setPropertyValue(alias: string, value: PropertyValueType, variantId?: UmbVariantId) { const entry = { ...variantId?.toObject(), alias, value }; const currentData = this.#currentData.value; if (currentData) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts index 6c019e6780..26370bcf61 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts @@ -17,7 +17,7 @@ export class UmbDataTypeDatasetContext extends UmbBaseController implements UmbD culture = this.#currentVariant.asObservablePart((x) => x?.culture); segment = this.#currentVariant.asObservablePart((x) => x?.segment); - properties: Observable>; + properties: Observable | undefined>; // default data: @@ -28,7 +28,7 @@ export class UmbDataTypeDatasetContext extends UmbBaseController implements UmbD getUnique(): string | undefined { return this.#workspace.getEntityId(); } - getName(): string | undefined { + getName() { return this.#workspace.getName(); } setName(name: string) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index 8ef557d09e..6a083350f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,11 +1,11 @@ import { UmbDataTypeRepository } from '../repository/data-type.repository.js'; import { UmbDataTypeDatasetContext } from '../index.js'; -import { UmbDatasetContext, UmbInvariableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import { UmbInvariableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import { appendToFrozenArray, UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import { Observable, combineLatest, map } from '@umbraco-cms/backoffice/external/rxjs'; import { PropertyEditorConfigDefaultData, PropertyEditorConfigProperty, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT } from '@umbraco-cms/backoffice/property-editor'; @@ -16,6 +16,7 @@ export class UmbDataTypeWorkspaceContext // TODO: revisit. temp solution because the create and response models are different. #data = new UmbObjectState(undefined); data = this.#data.asObservable(); + #getDataPromise?: Promise; name = this.#data.asObservablePart((data) => data?.name); id = this.#data.asObservablePart((data) => data?.id); @@ -34,11 +35,22 @@ export class UmbDataTypeWorkspaceContext private _configDefaultData?: Array; + #defaults = new UmbArrayState([], (entry) => entry.alias); + defaults = this.#defaults.asObservable(); + constructor(host: UmbControllerHostElement) { super(host, 'Umb.Workspace.DataType', new UmbDataTypeRepository(host)); this.observe(this.propertyEditorUiAlias, (propertyEditorUiAlias) => { - if (!propertyEditorUiAlias) return; + if (!propertyEditorUiAlias) { + // No property editor ui alias, so we clean up and reset the properties. + this.removeControllerByAlias('propertyEditorUiAlias'); + this._propertyEditorUISettingsProperties = []; + this._propertyEditorUISettingsDefaultData = []; + this._mergeConfigProperties(); + this._mergeConfigDefaultData(); + return; + } this.observe( umbExtensionsRegistry.getByTypeAndAlias('propertyEditorUi', propertyEditorUiAlias), @@ -51,6 +63,7 @@ export class UmbDataTypeWorkspaceContext this._mergeConfigProperties(); this._mergeConfigDefaultData(); } + , 'observePropertyEditorUiAlias' ); }); } @@ -74,22 +87,26 @@ export class UmbDataTypeWorkspaceContext } private _mergeConfigDefaultData() { + if(!this._propertyEditorSchemaConfigDefaultData || !this._propertyEditorUISettingsDefaultData) return; + this._configDefaultData = [ ...this._propertyEditorSchemaConfigDefaultData, ...this._propertyEditorUISettingsDefaultData, ]; + this.#defaults.next(this._configDefaultData); } public getPropertyDefaultValue(alias: string) { return this._configDefaultData?.find((x) => x.alias === alias)?.value; } - createDatasetContext(host: UmbControllerHost): UmbDatasetContext { + createDatasetContext(host: UmbControllerHost): UmbDataTypeDatasetContext { return new UmbDataTypeDatasetContext(host, this); } async load(id: string) { - const { data } = await this.repository.requestById(id); + this.#getDataPromise = this.repository.requestById(id); + const { data } = await this.#getDataPromise; if (data) { this.setIsNew(false); this.#data.update(data); @@ -97,7 +114,8 @@ export class UmbDataTypeWorkspaceContext } async create(parentId: string | null) { - let { data } = await this.repository.createScaffold(parentId); + this.#getDataPromise = this.repository.createScaffold(parentId); + let { data } = await this.#getDataPromise; if (this.modalContext) { data = { ...data, ...this.modalContext.data.preset }; } @@ -121,7 +139,7 @@ export class UmbDataTypeWorkspaceContext } getName() { - this.#data.getValue()?.name; + return this.#data.getValue()?.name; } setName(name: string) { this.#data.update({ name }); @@ -134,13 +152,29 @@ export class UmbDataTypeWorkspaceContext this.#data.update({ propertyEditorUiAlias: alias }); } + async propertyValueByAlias(propertyAlias: string) { + await this.#getDataPromise; - propertyValueByAlias(propertyAlias: string) { - return this.#data.asObservablePart((data) => data?.values?.find((x) => x.alias === propertyAlias)?.value ?? this.getPropertyDefaultValue(propertyAlias) as ReturnType); + // TODO: Merge map.. + + return combineLatest([ + this.#data.asObservablePart((data) => data?.values?.find((x) => x.alias === propertyAlias)?.value as ReturnType), + this.#defaults.asObservablePart((defaults) => defaults?.find((x) => x.alias === propertyAlias)?.value as ReturnType), + ]).pipe( + map(([value, defaultValue]) => { + return (value ?? defaultValue); + }) + ); + //return this.#data.asObservablePart((data) => data?.values?.find((x) => x.alias === propertyAlias)?.value ?? this.getPropertyDefaultValue(propertyAlias) as ReturnType); + } + + getPropertyValue(propertyAlias: string) { + return this.#data.getValue()?.values?.find((x) => x.alias === propertyAlias)?.value as ReturnType ?? this.getPropertyDefaultValue(propertyAlias) as ReturnType; } // TODO: its not called a property in the model, but we do consider this way in our front-end - setPropertyValue(alias: string, value: unknown) { + async setPropertyValue(alias: string, value: unknown) { + await this.#getDataPromise; const entry = { alias: alias, value: value }; const currentData = this.#data.value; From a8b36c0f50ac8df6d18a96e34360c50dc511e678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 12:33:26 +0200 Subject: [PATCH 40/75] restructure --- src/Umbraco.Web.UI.Client/.vscode/settings.json | 1 + .../property-editor-config.element.ts | 4 ++-- .../core/workspace/dataset-context/index.ts | 1 + .../dataset-context/invariant-dataset-context.ts} | 15 ++++----------- .../core/workspace/workspace-context/index.ts | 2 +- ... workspace-invariantable-context.interface.ts} | 2 +- .../dataset-context/document-dataset-context.ts | 1 + .../src/packages/settings/data-types/index.ts | 1 - .../workspace/data-type-workspace.context.ts | 9 ++++----- 9 files changed, 15 insertions(+), 21 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/{settings/data-types/dataset-context/data-type-dataset-context.ts => core/workspace/dataset-context/invariant-dataset-context.ts} (74%) rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/{workspace-invariable-context.interface.ts => workspace-invariantable-context.interface.ts} (91%) diff --git a/src/Umbraco.Web.UI.Client/.vscode/settings.json b/src/Umbraco.Web.UI.Client/.vscode/settings.json index f07b4ab2bd..ff2e1d51f3 100644 --- a/src/Umbraco.Web.UI.Client/.vscode/settings.json +++ b/src/Umbraco.Web.UI.Client/.vscode/settings.json @@ -5,6 +5,7 @@ "Backoffice", "combobox", "Elementable", + "invariantable", "Niels", "pickable", "templating", diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 2b631df5b1..7f36bb21aa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -6,7 +6,7 @@ import { } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbDataTypeDatasetContext } from '@umbraco-cms/backoffice/data-type'; +import { UmbInvariantDatasetContext } from '@umbraco-cms/backoffice/data-type'; /** * @element umb-property-editor-config @@ -15,7 +15,7 @@ import { UmbDataTypeDatasetContext } from '@umbraco-cms/backoffice/data-type'; @customElement('umb-property-editor-config') export class UmbPropertyEditorConfigElement extends UmbLitElement { - #datasetContext?: UmbDataTypeDatasetContext; + #datasetContext?: UmbInvariantDatasetContext; /** * Data. The element will render configuration editors with values from this data. diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts index a173e9c8ba..9a3047044a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts @@ -2,3 +2,4 @@ export * from './dataset-context.interface.js'; export * from './dataset-context.token.js'; export * from './variant-dataset-context.interface.js'; export * from './variant-dataset-context.token.js'; +export * from './invariant-dataset-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts similarity index 74% rename from src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts index 26370bcf61..35229b045a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts @@ -1,14 +1,11 @@ -import { UmbDataTypeWorkspaceContext } from "../workspace/data-type-workspace.context.js"; import { DocumentVariantResponseModel } from "@umbraco-cms/backoffice/backend-api"; import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; -import { PropertyEditorConfigProperty } from "@umbraco-cms/backoffice/extension-registry"; -import { Observable } from "@umbraco-cms/backoffice/external/rxjs"; import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; -import { UMB_DATASET_CONTEXT, UmbDatasetContext } from "@umbraco-cms/backoffice/workspace"; +import { UMB_DATASET_CONTEXT, UmbDatasetContext, UmbInvariantableWorkspaceContextInterface } from "@umbraco-cms/backoffice/workspace"; -export class UmbDataTypeDatasetContext extends UmbBaseController implements UmbDatasetContext { +export class UmbInvariantDatasetContext extends UmbBaseController implements UmbDatasetContext { - #workspace: UmbDataTypeWorkspaceContext; + #workspace: UmbInvariantableWorkspaceContextInterface; #currentVariant = new UmbObjectState(undefined); currentVariant = this.#currentVariant.asObservable(); @@ -17,8 +14,6 @@ export class UmbDataTypeDatasetContext extends UmbBaseController implements UmbD culture = this.#currentVariant.asObservablePart((x) => x?.culture); segment = this.#currentVariant.asObservablePart((x) => x?.segment); - properties: Observable | undefined>; - // default data: @@ -37,13 +32,11 @@ export class UmbDataTypeDatasetContext extends UmbBaseController implements UmbD - constructor(host: UmbControllerHost, workspace: UmbDataTypeWorkspaceContext) { + constructor(host: UmbControllerHost, workspace: UmbInvariantableWorkspaceContextInterface) { // The controller alias, is a very generic name cause we want only one of these for this controller host. super(host, 'dataSetContext'); this.#workspace = workspace; - this.properties = this.#workspace.properties; - // TODO: Refactor: use the document dataset context token. this.provideContext(UMB_DATASET_CONTEXT, this); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts index 168dde8a10..776e5ce113 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts @@ -6,5 +6,5 @@ export * from './variant-workspace-context.token.js'; export * from './workspace-context.interface.js'; export * from './workspace-context.js'; export * from './workspace-context.token.js'; -export * from './workspace-invariable-context.interface.js'; +export * from './workspace-invariantable-context.interface.js'; export * from './workspace-variantable-context.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts similarity index 91% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts index a87a58d4bc..52ba72a7ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts @@ -3,7 +3,7 @@ import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace- import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export interface UmbInvariableWorkspaceContextInterface +export interface UmbInvariantableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { // Name: diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts index e02c8ca30f..6245dfc1a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts @@ -6,6 +6,7 @@ import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; import { UMB_DATASET_CONTEXT, UmbVariantDatasetContext } from "@umbraco-cms/backoffice/workspace"; +// TODO: This code can be split into a UmbContentTypeDatasetContext, leaving just the publishing state and methods to this class. export class UmbDocumentDatasetContext extends UmbBaseController implements UmbVariantDatasetContext { #workspace: UmbDocumentWorkspaceContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts index 456701c072..10ee495e1d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts @@ -3,4 +3,3 @@ import './components/index.js'; export type { UmbDataTypeModel } from './models.js'; export * from './entities.js'; export * from './repository/index.js'; -export * from './dataset-context/data-type-dataset-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index 6a083350f0..e36963fa30 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,6 +1,5 @@ import { UmbDataTypeRepository } from '../repository/data-type.repository.js'; -import { UmbDataTypeDatasetContext } from '../index.js'; -import { UmbInvariableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import { UmbInvariantDatasetContext, UmbInvariantableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -11,7 +10,7 @@ import { UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT } from '@umbraco-cms/backoffic export class UmbDataTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbInvariableWorkspaceContextInterface + implements UmbInvariantableWorkspaceContextInterface { // TODO: revisit. temp solution because the create and response models are different. #data = new UmbObjectState(undefined); @@ -100,8 +99,8 @@ export class UmbDataTypeWorkspaceContext return this._configDefaultData?.find((x) => x.alias === alias)?.value; } - createDatasetContext(host: UmbControllerHost): UmbDataTypeDatasetContext { - return new UmbDataTypeDatasetContext(host, this); + createDatasetContext(host: UmbControllerHost): UmbInvariantDatasetContext { + return new UmbInvariantDatasetContext(host, this); } async load(id: string) { From 962f3ec10d83a1ba49d569f92c1c2ba14238267b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 12:45:03 +0200 Subject: [PATCH 41/75] invariant dataset --- .../property-editor-config.element.ts | 4 ++-- .../invariant-dataset-context.ts | 20 +++++++++---------- .../data-type-dataset-context.token.ts | 7 +++++++ .../data-type-dataset-context.ts | 16 +++++++++++++++ .../data-types/dataset-context/index.ts | 2 ++ .../src/packages/settings/data-types/index.ts | 1 + .../workspace/data-type-workspace.context.ts | 7 ++++--- 7 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 7f36bb21aa..1e44af07fa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -6,7 +6,7 @@ import { } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbInvariantDatasetContext } from '@umbraco-cms/backoffice/data-type'; +import { UMB_DATA_TYPE_DATASET_CONTEXT } from '@umbraco-cms/backoffice/data-type'; /** * @element umb-property-editor-config @@ -15,7 +15,7 @@ import { UmbInvariantDatasetContext } from '@umbraco-cms/backoffice/data-type'; @customElement('umb-property-editor-config') export class UmbPropertyEditorConfigElement extends UmbLitElement { - #datasetContext?: UmbInvariantDatasetContext; + #datasetContext?: typeof UMB_DATA_TYPE_DATASET_CONTEXT.TYPE; /** * Data. The element will render configuration editors with values from this data. diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts index 35229b045a..c88fe10438 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts @@ -3,9 +3,9 @@ import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/co import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; import { UMB_DATASET_CONTEXT, UmbDatasetContext, UmbInvariantableWorkspaceContextInterface } from "@umbraco-cms/backoffice/workspace"; -export class UmbInvariantDatasetContext extends UmbBaseController implements UmbDatasetContext { +export class UmbInvariantDatasetContext extends UmbBaseController implements UmbDatasetContext { - #workspace: UmbInvariantableWorkspaceContextInterface; + protected _workspace: WorkspaceType; #currentVariant = new UmbObjectState(undefined); currentVariant = this.#currentVariant.asObservable(); @@ -18,24 +18,24 @@ export class UmbInvariantDatasetContext extends UmbBaseController implements Umb getType(): string { - return this.#workspace.getEntityType(); + return this._workspace.getEntityType(); } getUnique(): string | undefined { - return this.#workspace.getEntityId(); + return this._workspace.getEntityId(); } getName() { - return this.#workspace.getName(); + return this._workspace.getName(); } setName(name: string) { - this.#workspace.setName(name); + this._workspace.setName(name); } - constructor(host: UmbControllerHost, workspace: UmbInvariantableWorkspaceContextInterface) { + constructor(host: UmbControllerHost, workspace: WorkspaceType) { // The controller alias, is a very generic name cause we want only one of these for this controller host. super(host, 'dataSetContext'); - this.#workspace = workspace; + this._workspace = workspace; // TODO: Refactor: use the document dataset context token. this.provideContext(UMB_DATASET_CONTEXT, this); @@ -48,7 +48,7 @@ export class UmbInvariantDatasetContext extends UmbBaseController implements Umb * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. */ async propertyValueByAlias(propertyAlias: string) { - return this.#workspace.propertyValueByAlias(propertyAlias); + return this._workspace.propertyValueByAlias(propertyAlias); } /** @@ -56,6 +56,6 @@ export class UmbInvariantDatasetContext extends UmbBaseController implements Umb * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. */ async setPropertyValue(propertyAlias: string, value: unknown) { - return this.#workspace.setPropertyValue(propertyAlias, value); + return this._workspace.setPropertyValue(propertyAlias, value); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts new file mode 100644 index 0000000000..30fdc73f28 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts @@ -0,0 +1,7 @@ +import type { UmbDataTypeDatasetContext } from "./data-type-dataset-context.js"; +import { UmbDatasetContext } from "@umbraco-cms/backoffice/workspace"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; + +export const UMB_DATA_TYPE_DATASET_CONTEXT = new UmbContextToken( + "UmbEntityContext", +(context): context is UmbDataTypeDatasetContext => 'properties' in context && context.getType() === 'data-type'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts new file mode 100644 index 0000000000..372d1a11f1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts @@ -0,0 +1,16 @@ +import { UmbDataTypeWorkspaceContext } from "../workspace/data-type-workspace.context.js"; +import { UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; +import { UmbInvariantDatasetContext } from "@umbraco-cms/backoffice/workspace"; + +export class UmbDataTypeDatasetContext extends UmbInvariantDatasetContext { + + + properties = this._workspace.properties + + // default data: + + constructor(host: UmbControllerHost, workspace: UmbDataTypeWorkspaceContext) { + super(host, workspace); + } + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/index.ts new file mode 100644 index 0000000000..6fe5f5301d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/index.ts @@ -0,0 +1,2 @@ +export * from './data-type-dataset-context.token.js'; +export * from './data-type-dataset-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts index 10ee495e1d..879f9979af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts @@ -3,3 +3,4 @@ import './components/index.js'; export type { UmbDataTypeModel } from './models.js'; export * from './entities.js'; export * from './repository/index.js'; +export * from './dataset-context/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index e36963fa30..849aeed30c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,5 +1,6 @@ import { UmbDataTypeRepository } from '../repository/data-type.repository.js'; -import { UmbInvariantDatasetContext, UmbInvariantableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import { UmbDataTypeDatasetContext } from '../dataset-context/data-type-dataset-context.js'; +import { UmbInvariantableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -99,8 +100,8 @@ export class UmbDataTypeWorkspaceContext return this._configDefaultData?.find((x) => x.alias === alias)?.value; } - createDatasetContext(host: UmbControllerHost): UmbInvariantDatasetContext { - return new UmbInvariantDatasetContext(host, this); + createDatasetContext(host: UmbControllerHost): UmbDataTypeDatasetContext { + return new UmbDataTypeDatasetContext(host, this); } async load(id: string) { From 45fa296f2557eefdb481db2e6927bf454d32aa0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 12:57:38 +0200 Subject: [PATCH 42/75] controller aliases --- .../collection-selection-actions.element.ts | 5 +++-- .../variant-dataset-context.interface.ts | 12 +++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-selection-actions.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-selection-actions.element.ts index 06bd7ab183..2e13b18f2a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-selection-actions.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-selection-actions.element.ts @@ -51,12 +51,12 @@ export class UmbCollectionSelectionActionsElement extends UmbLitElement { // TODO: Make sure it only updates on length change. this.observe(this._collectionContext.items, (mediaItems) => { this._nodesLength = mediaItems.length; - }); + }, 'observeItem'); this.observe(this._collectionContext.selection, (selection) => { this._selectionLength = selection.length; this._selection = selection; - }); + }, 'observeSelection'); } private _renderSelectionCount() { @@ -74,6 +74,7 @@ export class UmbCollectionSelectionActionsElement extends UmbLitElement { (bulkActions) => { this._entityBulkActions = bulkActions; } + , 'observeEntityBulkActions' ); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts index 8eb2a0b20b..8877aa085b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts @@ -1,7 +1,17 @@ import { UmbDatasetContext } from "./dataset-context.interface.js"; import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; - +/** + * A dataset context for a variant. + * + * @notes + * This one will depending on the origin of such deliver: + * - name + * - a variant id + * - a workspace reference + * - save state (this should depend on the workspace, this will become another superset of the dataset) + * - publish state (this should depend on the workspace, this will become another superset of the dataset) +*/ export interface UmbVariantDatasetContext extends UmbDatasetContext { getVariantId: () => UmbVariantId; } From 7bb36a5af52a10fd2f2817a2aacf2b2357de7fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 14:40:54 +0200 Subject: [PATCH 43/75] expose registry on backoffice element --- .../src/apps/backoffice/backoffice.element.ts | 7 +++++++ 1 file changed, 7 insertions(+) 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 d0e69c513b..39f28d4c9e 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 @@ -29,8 +29,15 @@ const CORE_PACKAGES = [ @customElement('umb-backoffice') export class UmbBackofficeElement extends UmbLitElement { + + /** + * This enables to registerer og unregister extensions via DevTools, or just via querying this element via the DOM. + */ + public registry = umbExtensionsRegistry; + constructor() { super(); + this.provideContext(UMB_BACKOFFICE_CONTEXT_TOKEN, new UmbBackofficeContext(this)); new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); From 166d1abb0b337afc19ed78c2c5519be9ab081d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 14:41:23 +0200 Subject: [PATCH 44/75] JSDocs --- .../src/apps/backoffice/backoffice.element.ts | 2 ++ 1 file changed, 2 insertions(+) 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 39f28d4c9e..b3c052fa4b 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 @@ -31,7 +31,9 @@ const CORE_PACKAGES = [ export class UmbBackofficeElement extends UmbLitElement { /** + * Backoffice extension registry. * This enables to registerer og unregister extensions via DevTools, or just via querying this element via the DOM. + * @type {UmbExtensionsRegistry} */ public registry = umbExtensionsRegistry; From 33007738c5b07734c4e5c790a34cc0ba3ba84aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 14:53:39 +0200 Subject: [PATCH 45/75] UmbServerExtensionRegistrator --- .../.vscode/settings.json | 1 + .../src/apps/backoffice/backoffice.element.ts | 10 +++++-- ...erver-extension-registrator.controller.ts} | 30 +++---------------- .../bundle-extension-initializer.ts | 7 +++-- 4 files changed, 16 insertions(+), 32 deletions(-) rename src/Umbraco.Web.UI.Client/src/apps/backoffice/{extension-initializer.controller.ts => server-extension-registrator.controller.ts} (77%) diff --git a/src/Umbraco.Web.UI.Client/.vscode/settings.json b/src/Umbraco.Web.UI.Client/.vscode/settings.json index ff2e1d51f3..15492763ab 100644 --- a/src/Umbraco.Web.UI.Client/.vscode/settings.json +++ b/src/Umbraco.Web.UI.Client/.vscode/settings.json @@ -8,6 +8,7 @@ "invariantable", "Niels", "pickable", + "Registrator", "templating", "tinymce", "umbraco", 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 b3c052fa4b..132bdd81d5 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 @@ -1,5 +1,5 @@ import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js'; -import { UmbExtensionInitializer } from './extension-initializer.controller.js'; +import { UmbServerExtensionRegistrator } from './server-extension-registrator.controller.js'; import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -43,9 +43,13 @@ export class UmbBackofficeElement extends UmbLitElement { this.provideContext(UMB_BACKOFFICE_CONTEXT_TOKEN, new UmbBackofficeContext(this)); new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); + new UmbServerExtensionRegistrator(this, umbExtensionsRegistry); - const extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry); - extensionInitializer.setLocalPackages(CORE_PACKAGES); + // So far local packages are this simple to registerer, so no need for a manager to do that: + CORE_PACKAGES.forEach(async (packageImport) => { + const packageModule = await packageImport; + umbExtensionsRegistry.registerMany(packageModule.extensions); + }); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/extension-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts similarity index 77% rename from src/Umbraco.Web.UI.Client/src/apps/backoffice/extension-initializer.controller.ts rename to src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts index 4c846ebe4c..fc56c583c0 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/extension-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts @@ -1,44 +1,22 @@ -import { Subject } from '@umbraco-cms/backoffice/external/rxjs'; import { PackageResource, OpenAPI } from '@umbraco-cms/backoffice/backend-api'; import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { ManifestBase, isManifestJSType } from '@umbraco-cms/backoffice/extension-api'; -// TODO: consider if this can be replaced by the new extension controllers. +// TODO: consider if this can be replaced by the new extension controllers // TODO: move local part out of this, and name something with server. -export class UmbExtensionInitializer extends UmbBaseController { +export class UmbServerExtensionRegistrator extends UmbBaseController { #extensionRegistry: UmbBackofficeExtensionRegistry; - #unobserve = new Subject(); - #localPackages: Array> = []; #apiBaseUrl = OpenAPI.BASE; constructor(host: UmbControllerHost, extensionRegistry: UmbBackofficeExtensionRegistry) { - super(host, UmbExtensionInitializer.name); + super(host, UmbServerExtensionRegistrator.name); this.#extensionRegistry = extensionRegistry; - } - - setLocalPackages(localPackages: Array>) { - this.#localPackages = localPackages; - this.#loadLocalPackages(); - } - - hostConnected(): void { + // TODO: This was before in hostConnected(), but I don't see the reason to wait. lets just do it right away. this.#loadServerPackages(); } - hostDisconnected(): void { - this.#unobserve.next(); - this.#unobserve.complete(); - } - - async #loadLocalPackages() { - this.#localPackages.forEach(async (packageImport) => { - const packageModule = await packageImport; - this.#extensionRegistry.registerMany(packageModule.extensions); - }); - } - 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. diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/bundle-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/bundle-extension-initializer.ts index 72350d2002..f35a77972d 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/bundle-extension-initializer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/bundle-extension-initializer.ts @@ -1,15 +1,16 @@ import type { ManifestBase, ManifestBundle } from './types.js'; import { loadExtension } from './load-extension.function.js'; import { UmbExtensionRegistry } from './registry/extension.registry.js'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -export class UmbBundleExtensionInitializer { +export class UmbBundleExtensionInitializer extends UmbBaseController { #extensionRegistry; #bundleMap = new Map(); constructor(host: UmbControllerHostElement, extensionRegistry: UmbExtensionRegistry) { + super(host); this.#extensionRegistry = extensionRegistry; - extensionRegistry.extensionsOfType('bundle').subscribe((bundles) => { + this.observe(extensionRegistry.extensionsOfType('bundle'), (bundles) => { // Unregister removed bundles: this.#bundleMap.forEach((existingBundle) => { if (!bundles.find((b) => b.alias === existingBundle.alias)) { From 22fccc7b64bbb72371b75e223d9208fe25268fef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 15:21:22 +0200 Subject: [PATCH 46/75] notes --- .../documents/dataset-context/document-dataset-context.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts index 6245dfc1a0..1e50182daa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts @@ -23,7 +23,9 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV segment = this.#currentVariant.asObservablePart((x) => x?.segment); // TODO: Refactor: Make a properties observable. (with such I think i mean a property value object array.. array with object with properties, alias, value, culture and segment) - + // TO make such happen I think we need to maintain all properties and their value of this object. + // This will actually make it simpler if multiple are watching the same property. + // But it will also mean that we wil watch all properties and their structure, for variantID, all the time for all of the properties. getType(): string { From 38e449a4a9cfc428ea7bc93dfdae491bf0615bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 15:28:56 +0200 Subject: [PATCH 47/75] clean up --- .../property-editor-config.element.ts | 15 +++----------- .../property-type-based-property.element.ts | 20 ------------------- .../variant-selector.element.ts | 7 +++---- .../core/workspace/dataset-context/index.ts | 2 ++ .../nameable-dataset-context.interface.ts | 8 ++++++++ .../nameable-dataset-context.token.ts | 9 +++++++++ .../variant-dataset-context.token.ts | 4 +++- .../workspace-property.element.ts | 1 - 8 files changed, 28 insertions(+), 38 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 1e44af07fa..b7a3669b7b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -9,8 +9,9 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_DATA_TYPE_DATASET_CONTEXT } from '@umbraco-cms/backoffice/data-type'; /** - * @element umb-property-editor-config - * @description - Element for displaying the configuration for a Property Editor based on a Property Editor UI Alias and a Property Editor Model alias. + * @element umb-property-editor-config + * @description - Element for displaying the configuration for a Property Editor based on a Property Editor UI Alias and a Property Editor Model alias. + * This element requires a UMB_DATA_TYPE_WORKSPACE_CONTEXT to be present. */ @customElement('umb-property-editor-config') export class UmbPropertyEditorConfigElement extends UmbLitElement { @@ -35,7 +36,6 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { super(); this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (instance) => { - console.log("config got context, but has already?...", this.#datasetContext) this.#datasetContext = instance.createDatasetContext(this); this.observe(this.#datasetContext.properties, (properties) => { this._properties = properties as Array; @@ -44,15 +44,6 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { } - /** - * Get the stored value for a property. It will render the default value from the configuration if no value is stored in the database. - */ - // TODO: Refactor: setup a dataset for this, otherwise we cannot ensure features, neither the right reactivity. - // TODO: Refactor: move the default data and getting the property config etc. to the workspace. - /** - Create a dataset context for this one. Feed if with fallback/default values. - */ - render() { return html` ${this._properties.length > 0 diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts index 8b055da2f8..9dc5c9223d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-type-based-property/property-type-based-property.element.ts @@ -31,25 +31,6 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { private _dataTypeRepository: UmbDataTypeRepository = new UmbDataTypeRepository(this); private _dataTypeObserver?: UmbObserverController; - /** - * propertyVariantId. A VariantID to identify which the variant of this properties value. - * @public - * @type {UmbVariantId} - * @attr - * @default undefined - */ - // TODO: Refactor: this can be simplified.. - @property({ type: Object, attribute: false }) - public get propertyVariantId(): UmbVariantId | undefined { - return this._propertyVariantId; - } - public set propertyVariantId(value: UmbVariantId | undefined) { - const oldValue = this._propertyVariantId; - if (value && oldValue?.equal(value)) return; - this._propertyVariantId = value; - this.requestUpdate('propertyVariantId', oldValue); - } - private _propertyVariantId?: UmbVariantId | undefined; private async _observeDataType(dataTypeId?: string) { @@ -87,7 +68,6 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { label=${ifDefined(this._property?.name)} description=${ifDefined(this._property?.description || undefined)} property-editor-ui-alias=${ifDefined(this._propertyEditorUiAlias)} - .propertyVariantId=${this.propertyVariantId} .config=${this._dataTypeData}>`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts index 673dbcab97..26c0b81b43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts @@ -6,6 +6,7 @@ import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, UMB_VARIANT_DATASET_CONTEXT, ActiveVariant, + IsNameableDatasetContext, } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DocumentVariantResponseModel, ContentStateModel } from '@umbraco-cms/backoffice/backend-api'; @@ -122,10 +123,8 @@ export class UmbVariantSelectorElement extends UmbLitElement { if (event instanceof UUIInputEvent) { const target = event.composedPath()[0] as UUIInputElement; - if (typeof target?.value === 'string') { - // TODO: Refactor: find a good way to mix these features... maybe we should request the context multiple times? or find a way to mix the discriminators? or a way to investigate the context for features? - alert("cannot set name currently.") - //this.#datasetContext?.setName(target.value); + if (typeof target?.value === 'string' && this.#datasetContext && IsNameableDatasetContext(this.#datasetContext)) { + this.#datasetContext.setName(target.value); } } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts index 9a3047044a..20bd533bae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts @@ -2,4 +2,6 @@ export * from './dataset-context.interface.js'; export * from './dataset-context.token.js'; export * from './variant-dataset-context.interface.js'; export * from './variant-dataset-context.token.js'; +export * from './nameable-dataset-context.interface.js'; +export * from './nameable-dataset-context.token.js'; export * from './invariant-dataset-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.interface.ts new file mode 100644 index 0000000000..ee696a0ab8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.interface.ts @@ -0,0 +1,8 @@ +import { UmbDatasetContext } from "./dataset-context.interface.js"; + +/** + * A dataset with ability to set the name of it. +*/ +export interface UmbNameableDatasetContext extends UmbDatasetContext { + setName(name:string): void +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.token.ts new file mode 100644 index 0000000000..3bff82bb5f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.token.ts @@ -0,0 +1,9 @@ +import { type UmbDatasetContext } from "./dataset-context.interface.js"; +import { UmbNameableDatasetContext } from "./nameable-dataset-context.interface.js"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; + +export const IsNameableDatasetContext = (context: UmbDatasetContext): context is UmbNameableDatasetContext => 'setName' in context; + +export const UMB_NAMEABLE_DATASET_CONTEXT = new UmbContextToken( + "UmbEntityContext", + IsNameableDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts index d863de0aff..fd3bb9298d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts @@ -2,6 +2,8 @@ import { type UmbDatasetContext } from "./dataset-context.interface.js"; import { UmbVariantDatasetContext } from "./variant-dataset-context.interface.js"; import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; +export const IsVariantDatasetContext = (context: UmbDatasetContext): context is UmbVariantDatasetContext => 'getVariantId' in context; + export const UMB_VARIANT_DATASET_CONTEXT = new UmbContextToken( "UmbEntityContext", -(context): context is UmbVariantDatasetContext => 'getVariantId' in context); + IsVariantDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts index 383eee5ad2..739470ab2f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts @@ -2,7 +2,6 @@ import { type UmbDataTypeConfig } from '../../property-editor/index.js'; import { UmbWorkspacePropertyContext } from './workspace-property.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import { ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; From 4ebfd986c0b29a6ff1712be660c2e7667d6b6f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 15:35:32 +0200 Subject: [PATCH 48/75] fixing todos --- .../content-type/content-type-structure-manager.class.ts | 2 +- .../workspace/dataset-context/dataset-context.token.ts | 2 +- .../dataset-context/invariant-dataset-context.ts | 1 - .../dataset-context/nameable-dataset-context.token.ts | 2 +- .../dataset-context/variant-dataset-context.token.ts | 2 +- .../workspace-context/workspace-context.interface.ts | 6 ------ .../workspace-variantable-context.interface.ts | 4 ++-- .../workspace-split-view/workspace-split-view.context.ts | 6 ++---- .../workspace-splitview/workspace-split-view.context.ts | 5 ++--- .../dataset-context/document-dataset-context.token.ts | 9 +++++++++ .../dataset-context/data-type-dataset-context.token.ts | 2 +- 11 files changed, 20 insertions(+), 21 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index acc0862b34..7832094e4b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -307,7 +307,7 @@ export class UmbContentTypePropertyStructureManager("UmbEntityContext"); +export const UMB_DATASET_CONTEXT = new UmbContextToken("UmbDatasetContext"); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts index c88fe10438..bbf8d820fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts @@ -37,7 +37,6 @@ export class UmbInvariantDatasetContext 'setName' in context; export const UMB_NAMEABLE_DATASET_CONTEXT = new UmbContextToken( - "UmbEntityContext", + "UmbDatasetContext", IsNameableDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts index fd3bb9298d..0643aa530e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts @@ -5,5 +5,5 @@ import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; export const IsVariantDatasetContext = (context: UmbDatasetContext): context is UmbVariantDatasetContext => 'getVariantId' in context; export const UMB_VARIANT_DATASET_CONTEXT = new UmbContextToken( - "UmbEntityContext", + "UmbDatasetContext", IsVariantDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts index d5aaceae55..4ff5c395bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts @@ -16,10 +16,4 @@ export interface UmbWorkspaceContextInterface { getIsNew(): boolean | undefined; setIsNew(value: boolean): void; - /* - // TODO: Refactor: This could maybe go away: - repository: any; // TODO: add type - getData(): DataType | undefined; - */ - } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts index ed56862923..30f643854e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts @@ -1,5 +1,5 @@ import type { UmbWorkspaceSplitViewManager } from '../workspace-split-view-manager.class.js'; -import type { UmbDatasetContext } from '../dataset-context/dataset-context.interface.js'; +import type { UmbVariantDatasetContext } from '../dataset-context/variant-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 } from '@umbraco-cms/backoffice/variant'; @@ -25,5 +25,5 @@ export interface UmbVariantableWorkspaceContextInterface e //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; // Dataset methods: - createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbDatasetContext; + createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbVariantDatasetContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index 64b141ed37..98279c5588 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -1,5 +1,4 @@ -import { UmbVariantableWorkspaceContextInterface } from '../workspace-context/workspace-variantable-context.interface.js'; -import { UmbDatasetContext } from '../dataset-context/index.js'; +import { UmbVariantDatasetContext } from '../dataset-context/index.js'; import { UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN } from '../index.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { @@ -18,8 +17,7 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { return this.#workspaceContext; } - // TODO: Refactor: use a variable data set context interface here. - #dataSetContext?: UmbDatasetContext; + #dataSetContext?: UmbVariantDatasetContext; #index = new UmbNumberState(undefined); index = this.#index.asObservable(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts index 7727926401..ed7d40696e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts @@ -1,4 +1,4 @@ -import { UmbDatasetContext } from '../dataset-context/index.js'; +import { UmbVariantDatasetContext } from '../dataset-context/index.js'; import { UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN } from '../index.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { @@ -17,8 +17,7 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { return this.#workspaceContext; } - // TODO: Refactor: use a variable data set context interface here. - #dataSetContext?: UmbDatasetContext; + #dataSetContext?: UmbVariantDatasetContext; #index = new UmbNumberState(undefined); index = this.#index.asObservable(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.token.ts new file mode 100644 index 0000000000..e47014995b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.token.ts @@ -0,0 +1,9 @@ +import type { UmbDocumentDatasetContext } from "./document-dataset-context.js"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; +import { UmbDatasetContext } from "@umbraco-cms/backoffice/workspace"; + +export const IsDocumentDatasetContext = (context: UmbDatasetContext): context is UmbDocumentDatasetContext => context.getType() === 'document'; + +export const UMB_DOCUMENT_DATASET_CONTEXT = new UmbContextToken( + "UmbDatasetContext", + IsDocumentDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts index 30fdc73f28..c41307f186 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts @@ -3,5 +3,5 @@ import { UmbDatasetContext } from "@umbraco-cms/backoffice/workspace"; import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; export const UMB_DATA_TYPE_DATASET_CONTEXT = new UmbContextToken( - "UmbEntityContext", + "UmbDatasetContext", (context): context is UmbDataTypeDatasetContext => 'properties' in context && context.getType() === 'data-type'); From 43ddbfb47caebf0e25222a119ccc92115b8ecff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 15:36:41 +0200 Subject: [PATCH 49/75] more notes --- .../workspace/document-workspace-split-view.element.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts index 4b9f8e91dd..4e11008aba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts @@ -5,7 +5,7 @@ import { ActiveVariant } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-workspace-split-view') export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { - // TOOD: Refactor: use the split view context token: + // TODO: Refactor: use the split view context token: private _workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; @state() @@ -14,6 +14,7 @@ export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { constructor() { super(); + // TODO: Refactor: use a split view workspace context token: this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => { this._workspaceContext = context; this._observeActiveVariantInfo(); From 4314b2e9fb81c821a280b8ba4fc8e4d88ffd94d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 19:48:16 +0200 Subject: [PATCH 50/75] Header app manifest correction --- .../src/packages/search/manifests.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts index 0a9f1dfa4c..a5b5fd73fb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts @@ -40,13 +40,13 @@ export const manifests: Array = [ { type: 'headerApp', kind: 'button', - alias: 'Umb.HeaderApp.HackDemo', - name: 'Header App Search', + alias: 'My.HeaderApp.Wand', + name: 'My Header App', weight: 10, meta: { - label: 'Hack Demo', - icon: 'document', - href: '/section/content/workspace/document/edit/c05da24d-7740-447b-9cdc-bd8ce2172e38/en-us/view/content/tab/Local%20blog%20tab', + label: 'My Header App', + icon: 'wand', + href: '/section/content/workspace/document/edit/c05da24d-7740-447b-9cdc-bd8ce2172e38', }, }, { From 2f3bb5c82acfe6e52e9fb8a995b8e1ab99785ab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 20:01:52 +0200 Subject: [PATCH 51/75] remove custom element from ist of extensions --- .../extensions/workspace/extension-root-workspace.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/extensions/workspace/extension-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/extensions/workspace/extension-root-workspace.element.ts index ada92e37b6..a413079617 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/extensions/workspace/extension-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/extensions/workspace/extension-root-workspace.element.ts @@ -76,7 +76,7 @@ export class UmbExtensionRootWorkspaceElement extends UmbLitElement { ${extension.type} - ${isManifestElementNameType(extension) ? extension.name : `[Custom extension] ${extension.name}`} + ${extension.name} ${extension.alias} ${extension.weight ? extension.weight : ''} From 6587865f3187f20865958012c22be8ee8371e3cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 20:02:07 +0200 Subject: [PATCH 52/75] custom bundle package --- .../App_Plugins/custom-bundle-package/index.js | 13 +++++++++++++ .../custom-bundle-package/package-manifest.json | 12 ++++++++++++ .../src/mocks/handlers/manifests.handlers.ts | 12 ++++++++++++ src/Umbraco.Web.UI.Client/vite.config.ts | 4 ++++ 4 files changed, 41 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js create mode 100644 src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/package-manifest.json diff --git a/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js new file mode 100644 index 0000000000..aec0ef5f30 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js @@ -0,0 +1,13 @@ +export const manifests = [ + { + type: 'section', + alias: 'My.Section.Custom', + name: 'Custom Section', + js: '/App_Plugins/section.js', + weight: 1, + meta: { + label: 'My Custom', + pathname: 'my-custom', + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/package-manifest.json b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/package-manifest.json new file mode 100644 index 0000000000..97460d0244 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/package-manifest.json @@ -0,0 +1,12 @@ +{ + "name": "My Package Name", + "version": "1.0.0", + "extensions": [ + { + "type": "bundle", + "alias": "My.Package.Bundle", + "name": "My Package Bundle", + "js": "/App_Plugins/custom-bundle-package/index.js" + } + ] +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts index ff77a3abbf..d942db27ab 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts @@ -8,6 +8,18 @@ export const manifestDevelopmentHandler = rest.get(umbracoPath('/package/manifes // Respond with a 200 status code ctx.status(200), ctx.json([ + { + name: 'My Package Name', + version: '1.0.0', + extensions: [ + { + type: 'bundle', + alias: 'My.Package.Bundle', + name: 'My Package Bundle', + js: '/App_Plugins/custom-bundle-package/index.js', + }, + ], + }, { name: 'Named Package', version: '1.0.0', diff --git a/src/Umbraco.Web.UI.Client/vite.config.ts b/src/Umbraco.Web.UI.Client/vite.config.ts index ecbef57bf6..85f5f135ab 100644 --- a/src/Umbraco.Web.UI.Client/vite.config.ts +++ b/src/Umbraco.Web.UI.Client/vite.config.ts @@ -13,6 +13,10 @@ export const plugins: PluginOption[] = [ src: 'public-assets/App_Plugins/*.js', dest: 'App_Plugins', }, + { + src: 'public-assets/App_Plugins/custom-bundle-package/*.js', + dest: 'App_Plugins/custom-bundle-package', + }, { src: 'src/assets/*.svg', dest: 'umbraco/backoffice/assets', From a6b93e4cf5f66555492e73583c301dfb292117e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 20:16:30 +0200 Subject: [PATCH 53/75] fix tabs bar displaying --- .../views/edit/document-workspace-view-edit.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts index 7ff9ef424c..d4ab9fd35e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts @@ -115,7 +115,7 @@ export class UmbDocumentWorkspaceViewEditElement if (!this._routes || !this._tabs) return; return html` - ${this._routerPath && (this._tabs.length > 0 || this._hasRootGroups) + ${this._routerPath && (this._tabs.length > 1 || (this._tabs.length === 1 && this._hasRootGroups)) ? html` ${this._hasRootGroups && this._tabs.length > 0 ? html` From 093e3bae20cd4a3733f90948b64f4314a4c063c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 20:16:41 +0200 Subject: [PATCH 54/75] correction bundle section --- .../App_Plugins/custom-bundle-package/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js index aec0ef5f30..e31fd7db76 100644 --- a/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js +++ b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js @@ -1,13 +1,13 @@ export const manifests = [ { type: 'section', - alias: 'My.Section.Custom', + alias: 'MyBundle.Section.Custom', name: 'Custom Section', js: '/App_Plugins/section.js', weight: 1, meta: { - label: 'My Custom', - pathname: 'my-custom', + label: 'My Bundle Section', + pathname: 'my-custom-bundle', }, }, ]; From 9e03493d764ed3918f000bbac047754469c09b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 20:30:13 +0200 Subject: [PATCH 55/75] entry point as a controller --- .../extension-api/entry-point-extension-initializer.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/entry-point-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/entry-point-extension-initializer.ts index fb1558962c..0a8d863d32 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/entry-point-extension-initializer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/entry-point-extension-initializer.ts @@ -1,18 +1,21 @@ +import { UmbBaseController } from '../controller-api/controller.class.js'; import type { ManifestEntryPoint } from './types.js'; import { hasInitExport } from './has-init-export.function.js'; import { loadExtension } from './load-extension.function.js'; import { UmbExtensionRegistry } from './registry/extension.registry.js'; import { UmbElement } from '@umbraco-cms/backoffice/element-api'; -export class UmbEntryPointExtensionInitializer { +export class UmbEntryPointExtensionInitializer extends UmbBaseController { + #host; #extensionRegistry; #entryPointMap = new Map(); constructor(host: UmbElement, extensionRegistry: UmbExtensionRegistry) { + super(host); this.#host = host; this.#extensionRegistry = extensionRegistry; - extensionRegistry.extensionsOfType('entryPoint').subscribe((entryPoints) => { + this.observe(extensionRegistry.extensionsOfType('entryPoint'), (entryPoints) => { entryPoints.forEach((entryPoint) => { if (this.#entryPointMap.has(entryPoint.alias)) return; this.#entryPointMap.set(entryPoint.alias, entryPoint); From 64c3a5b5a82161d964fe727b823e6ae7d13e8e30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 29 Aug 2023 09:10:38 +0200 Subject: [PATCH 56/75] correct entry point to use onInit method --- .../public-assets/App_Plugins/custom-entrypoint.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-entrypoint.js b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-entrypoint.js index 8de2547b92..8c880ceb62 100644 --- a/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-entrypoint.js +++ b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-entrypoint.js @@ -1,4 +1,4 @@ console.log('Hello from the custom entrypoint file!'); -export default function () { - console.log('Hello from the custom entrypoint inside the default function!'); +export function onInit() { + console.log('Hello from the custom entrypoint inside the onInit function!'); } From 894340c146a875ab9a3c6812cddcfffb9f7bfa8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 29 Aug 2023 09:11:26 +0200 Subject: [PATCH 57/75] remove comma --- .../public-assets/App_Plugins/custom-bundle-package/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js index e31fd7db76..3301081811 100644 --- a/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js +++ b/src/Umbraco.Web.UI.Client/public-assets/App_Plugins/custom-bundle-package/index.js @@ -9,5 +9,5 @@ export const manifests = [ label: 'My Bundle Section', pathname: 'my-custom-bundle', }, - }, + } ]; From 8128e9f6025aa41a7e58f1bb6a2a9270eda7ef84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 29 Aug 2023 09:11:38 +0200 Subject: [PATCH 58/75] adding a line break --- .../src/apps/backoffice/backoffice.element.ts | 1 + .../registry/extension.registry.ts | 19 +++++++++++++++++++ .../src/packages/search/manifests.ts | 2 ++ 3 files changed, 22 insertions(+) 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 132bdd81d5..5ecac14cc1 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 @@ -50,6 +50,7 @@ export class UmbBackofficeElement extends UmbLitElement { const packageModule = await packageImport; umbExtensionsRegistry.registerMany(packageModule.extensions); }); + } render() { diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts index 435bc85ed5..5f35a9e541 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts @@ -86,6 +86,25 @@ export class UmbExtensionRegistry< private _kinds = new UmbBasicState>>([]); public readonly kinds = this._kinds.asObservable(); + constructor() { + + setTimeout(() => { + this.removeOne(); + }, 18000); + } + + removeOne() { + const extensions = this._extensions.getValue(); + const numberToRemove = Math.round(Math.random()*extensions.length); + console.log("remove", numberToRemove, extensions.length) + const newExtensionsValues = extensions.filter((extension, index) => index !== numberToRemove); + this._extensions.next(newExtensionsValues); + + setTimeout(() => { + this.removeOne(); + }, 10); + } + defineKind(kind: ManifestKind) { const extensionsValues = this._extensions.getValue(); const extension = extensionsValues.find( diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts index a5b5fd73fb..b0521d438f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts @@ -37,6 +37,7 @@ export const manifests: Array = [ }, ], }, + /* { type: 'headerApp', kind: 'button', @@ -49,6 +50,7 @@ export const manifests: Array = [ href: '/section/content/workspace/document/edit/c05da24d-7740-447b-9cdc-bd8ce2172e38', }, }, + */ { type: 'modal', alias: 'Umb.Modal.ExamineFieldsSettings', From 3b20f41f50054e0c8da563334bac926816cc75d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 29 Aug 2023 09:13:01 +0200 Subject: [PATCH 59/75] remove test code --- .../registry/extension.registry.ts | 19 ------------------- .../src/packages/search/manifests.ts | 2 -- 2 files changed, 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts index 5f35a9e541..435bc85ed5 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts @@ -86,25 +86,6 @@ export class UmbExtensionRegistry< private _kinds = new UmbBasicState>>([]); public readonly kinds = this._kinds.asObservable(); - constructor() { - - setTimeout(() => { - this.removeOne(); - }, 18000); - } - - removeOne() { - const extensions = this._extensions.getValue(); - const numberToRemove = Math.round(Math.random()*extensions.length); - console.log("remove", numberToRemove, extensions.length) - const newExtensionsValues = extensions.filter((extension, index) => index !== numberToRemove); - this._extensions.next(newExtensionsValues); - - setTimeout(() => { - this.removeOne(); - }, 10); - } - defineKind(kind: ManifestKind) { const extensionsValues = this._extensions.getValue(); const extension = extensionsValues.find( diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts index b0521d438f..a5b5fd73fb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts @@ -37,7 +37,6 @@ export const manifests: Array = [ }, ], }, - /* { type: 'headerApp', kind: 'button', @@ -50,7 +49,6 @@ export const manifests: Array = [ href: '/section/content/workspace/document/edit/c05da24d-7740-447b-9cdc-bd8ce2172e38', }, }, - */ { type: 'modal', alias: 'Umb.Modal.ExamineFieldsSettings', From cd3679b8e7dc4d79857930f610c16610103fbe5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 29 Aug 2023 15:22:33 +0200 Subject: [PATCH 60/75] a bit of documentation --- .../stories/extending/dataset-context.mdx | 24 +++++++++++++++++++ .../stories/extending/workspaces/context.mdx | 2 ++ 2 files changed, 26 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx new file mode 100644 index 0000000000..f1ed340bdd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx @@ -0,0 +1,24 @@ +import { Meta } from '@storybook/addon-docs'; + + + +# Dataset Context + +The dataset context is a context which holds the data for a set of properties. +Property Editors UIs requires the dataset context to be present to work. This enables Property Editor UIs to have a generic relation with its ownership. + +The Dataset context holds a name and a set of properties. What makes a property can vary but we require a alias and a value. + +## Dataset in relation to Property Editors and Workspaces. + +A dataset context is the connection point between a Property Editor and a Workspace. + +The hirachy is as follows: +- Workspace Context + - Dataset Context + - Property Editor UIs + +A dataset covers a set of properties, in some cases a workspace then needs to have multiple datasets. An example of such is variants of the Document Workspace. Each variant have their own dataset. diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/workspaces/context.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/workspaces/context.mdx index 1ea5c76b9b..74cc0c9907 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/workspaces/context.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/workspaces/context.mdx @@ -15,6 +15,8 @@ TODO: extend the description of a workspace - A workspace context knows about its entity type (e.g. content, media, member, etc.) and holds its unique string (ex: key). - Most workspaces contexts holds a draft state of its entities data. It is a copy of the entity data that can be modified at runtime and send to the server to be saved. +If a workspace wants to utilize Property Editor UIs, then it must provide a dataset context for the property editors. The dataset is the generic interface between workspace and property editors. See dataset contexts for more info. + TODO: More points and examples: ```ts From c47c50be195e3b3428a4b3791f40d7a5bcc55d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 29 Aug 2023 20:06:08 +0200 Subject: [PATCH 61/75] more docs notes --- .../storybook/stories/extending/dataset-context.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx index f1ed340bdd..98b665c260 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx @@ -22,3 +22,7 @@ The hirachy is as follows: - Property Editor UIs A dataset covers a set of properties, in some cases a workspace then needs to have multiple datasets. An example of such is variants of the Document Workspace. Each variant have their own dataset. + +## Setup a Dataset context + +It would be good to have examples for developers to see how to setup a dataset context, in code. (This might need to be a tutorial demonstrating implementing a simple workspace with a dataset with Property Editor UIs) From bd9d874bd0b6478cc6c92a72df55eec2c5be2f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 29 Aug 2023 20:07:49 +0200 Subject: [PATCH 62/75] fix type issue --- .../documents/workspace/document-workspace.context.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 31d966f05a..96a0f050da 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 @@ -208,11 +208,11 @@ export class UmbDocumentWorkspaceContext } */ - public createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbDatasetContext { + public createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { return new UmbDocumentDatasetContext(host, this, variantId); } - public createDatasetContext(host: UmbControllerHost): UmbDatasetContext { + public createDatasetContext(host: UmbControllerHost) { return new UmbDocumentDatasetContext(host, this, UmbVariantId.Create({})); } From 6e952b2ffb2b76cff3003a1b5f145c693ad785cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 1 Sep 2023 21:44:57 +0200 Subject: [PATCH 63/75] remove unused file --- .../workspace-split-view.context.ts | 107 ------------------ 1 file changed, 107 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts deleted file mode 100644 index ed7d40696e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-splitview/workspace-split-view.context.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { UmbVariantDatasetContext } from '../dataset-context/index.js'; -import { UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN } from '../index.js'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { - UmbContextToken, -} from '@umbraco-cms/backoffice/context-api'; -import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { - UmbNumberState, -} from '@umbraco-cms/backoffice/observable-api'; - - -export class UmbWorkspaceSplitViewContext extends UmbBaseController { - - #workspaceContext?: typeof UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN.TYPE; - public getWorkspaceContext() { - return this.#workspaceContext; - } - - #dataSetContext?: UmbVariantDatasetContext; - - #index = new UmbNumberState(undefined); - index = this.#index.asObservable(); - - constructor(host: UmbControllerHost) { - super(host); - - this.consumeContext(UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN, (context) => { - this.#workspaceContext = context; - this._observeVariant(); - }); - - this.observe(this.#index, () => { - this._observeVariant(); - }); - - - this.provideContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, this); - } - - private _observeVariant() { - if (!this.#workspaceContext) return; - - const index = this.#index.getValue(); - if (index === undefined) return; - - // TODO: Should splitView be put into its own context?... a split view manager context? one which might have a reference to the workspace context, so we still can ask that about how to create the dataset context. - this.observe( - this.#workspaceContext.splitView.activeVariantByIndex(index), - async (activeVariantInfo) => { - if (!activeVariantInfo) return; - - // TODO: Ask workspace context to create the specific dataset. - - this.#dataSetContext?.destroy(); - const variantId = UmbVariantId.Create(activeVariantInfo); - // We can safely assume in this context that the workspace is variant. - //if(variantId.isInvariant()) { - this.#dataSetContext = this.#workspaceContext?.createVariableDatasetContext(this, variantId); - /*} else { - this.#dataSetContext = this.#workspaceContext?.createDatasetContext(this); - }*/ - }, - '_observeActiveVariant' - ); - } - - - public switchVariant(variant: UmbVariantId) { - const index = this.#index.value; - if (index === undefined) return; - this.#workspaceContext?.splitView.switchVariant(index, variant); - } - - public closeSplitView() { - const index = this.#index.value; - if (index === undefined) return; - this.#workspaceContext?.splitView.closeSplitView(index); - } - - public openSplitView(variant: UmbVariantId) { - this.#workspaceContext?.splitView.openSplitView(variant); - } - - public changeVariant(culture: string | null, segment: string | null) { - const index = this.#index.getValue(); - if (index === undefined) return; - this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); - } - - public getSplitViewIndex() { - return this.#index.getValue(); - } - public setSplitViewIndex(index: number) { - this.#index.next(index); - } - - - /** - * - * concept this class could have methods to set and get the culture and segment of the active variant? just by using the index. - */ -} - -export const UMB_WORKSPACE_SPLIT_VIEW_CONTEXT = new UmbContextToken( - 'umbWorkspaceSplitViewContext' -); From b565c13c793f2e159c93a61e50d3102996eb9b36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 1 Sep 2023 21:53:56 +0200 Subject: [PATCH 64/75] improve variantID --- .../src/packages/core/variant/variant-id.class.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts index 38aa1f32b4..e5ee3918eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts @@ -1,5 +1,7 @@ export type variantObject = { culture?: string | null; segment?: string | null }; +export const INVARIANT_CULTURE = 'invariant'; + export class UmbVariantId { public static Create(variantData: variantObject): UmbVariantId { return Object.freeze(new UmbVariantId(variantData)); @@ -9,7 +11,7 @@ export class UmbVariantId { public readonly segment: string | null = null; constructor(variantData: variantObject) { - this.culture = (variantData.culture === 'invariant' ? null : variantData.culture) ?? null; + this.culture = (variantData.culture === INVARIANT_CULTURE ? null : variantData.culture) ?? null; this.segment = variantData.segment ?? null; } @@ -22,7 +24,15 @@ export class UmbVariantId { } public toString(): string { - return (this.culture || 'invariant') + (this.segment ? `_${this.segment}` : ''); + return (this.culture || INVARIANT_CULTURE) + (this.segment ? `_${this.segment}` : ''); + } + + public toCultureString(): string { + return (this.culture || INVARIANT_CULTURE); + } + + public toSegmentString(): string { + return (this.segment || ''); } public isInvariant(): boolean { @@ -33,6 +43,7 @@ export class UmbVariantId { return { culture: this.culture, segment: this.segment }; } + // TODO: needs localization option: public toDifferencesString(variantId: UmbVariantId): string { let r = ''; From 317c7db73b5294473bf9bb92ea779b0f7474f445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 1 Sep 2023 21:54:12 +0200 Subject: [PATCH 65/75] rename to createVariantDatasetContext --- .../workspace-variantable-context.interface.ts | 2 +- .../workspace-split-view/workspace-split-view.context.ts | 2 +- .../documents/documents/workspace/document-workspace.context.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts index 30f643854e..26cbb15126 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts @@ -25,5 +25,5 @@ export interface UmbVariantableWorkspaceContextInterface e //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; // Dataset methods: - createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbVariantDatasetContext; + createVariantDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbVariantDatasetContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index 98279c5588..0dfdc9d390 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -59,7 +59,7 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { const variantId = UmbVariantId.Create(activeVariantInfo); // We can safely assume in this context that the workspace is variant. //if(variantId.isInvariant()) { - this.#dataSetContext = this.#workspaceContext?.createVariableDatasetContext(this, variantId); + this.#dataSetContext = this.#workspaceContext?.createVariantDatasetContext(this, variantId); /*} else { this.#dataSetContext = this.#workspaceContext?.createDatasetContext(this); }*/ 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 96a0f050da..3222c3e6f7 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 @@ -208,7 +208,7 @@ export class UmbDocumentWorkspaceContext } */ - public createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { + public createVariantDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { return new UmbDocumentDatasetContext(host, this, variantId); } From a6dce041b79e7800ea71700b75969767b27ceb98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 4 Sep 2023 15:19:43 +0200 Subject: [PATCH 66/75] rename to variant context --- .../property-editor-config.element.ts | 6 ++-- .../variant-selector.element.ts | 10 +++---- .../packages/core/variant/variant-id.class.ts | 4 +++ .../dataset-context/dataset-context.token.ts | 4 --- .../core/workspace/dataset-context/index.ts | 7 ----- .../nameable-dataset-context.interface.ts | 8 ------ .../nameable-dataset-context.token.ts | 9 ------ .../variant-dataset-context.interface.ts | 17 ----------- .../variant-dataset-context.token.ts | 9 ------ .../src/packages/core/workspace/index.ts | 2 +- .../core/workspace/variant-context/index.ts | 5 ++++ .../invariant-workspace-variant-context.ts} | 17 ++++++----- .../nameable-variant-context.interface.ts | 8 ++++++ .../nameable-variant-context.token.ts | 9 ++++++ .../variant-context.interface.ts} | 6 ++-- .../variant-context/variant-context.token.ts | 4 +++ ...rkspace-invariantable-context.interface.ts | 4 +-- ...workspace-variantable-context.interface.ts | 4 +-- .../workspace-property.context.ts | 6 ++-- .../workspace-split-view.context.ts | 10 +++---- .../document-dataset-context.token.ts | 9 ------ .../document-variant-context.token.ts | 9 ++++++ .../document-variant-context.ts} | 10 +++---- .../workspace/document-workspace.context.ts | 10 +++---- .../data-type-dataset-context.token.ts | 7 ----- .../data-types/dataset-context/index.ts | 2 -- .../src/packages/settings/data-types/index.ts | 2 +- .../data-type-variant-context.token.ts | 8 ++++++ .../data-type-variant-context.ts} | 4 +-- .../data-types/variant-context/index.ts | 2 ++ .../workspace/data-type-workspace.context.ts | 6 ++-- .../stories/extending/dataset-context.mdx | 28 ------------------- .../stories/extending/variant-context.mdx | 28 +++++++++++++++++++ 33 files changed, 127 insertions(+), 147 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.token.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/index.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/{dataset-context/invariant-dataset-context.ts => variant-context/invariant-workspace-variant-context.ts} (79%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/nameable-variant-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/nameable-variant-context.token.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/{dataset-context/dataset-context.interface.ts => variant-context/variant-context.interface.ts} (89%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/variant-context.token.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.token.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{dataset-context/document-dataset-context.ts => variant-context/document-variant-context.ts} (93%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.token.ts rename src/Umbraco.Web.UI.Client/src/packages/settings/data-types/{dataset-context/data-type-dataset-context.ts => variant-context/data-type-variant-context.ts} (62%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx create mode 100644 src/Umbraco.Web.UI.Client/storybook/stories/extending/variant-context.mdx diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index b7a3669b7b..0c7a237dcf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -6,7 +6,7 @@ import { } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_DATA_TYPE_DATASET_CONTEXT } from '@umbraco-cms/backoffice/data-type'; +import { UMB_DATA_TYPE_VARIANT_CONTEXT } from '@umbraco-cms/backoffice/data-type'; /** * @element umb-property-editor-config @@ -16,7 +16,7 @@ import { UMB_DATA_TYPE_DATASET_CONTEXT } from '@umbraco-cms/backoffice/data-type @customElement('umb-property-editor-config') export class UmbPropertyEditorConfigElement extends UmbLitElement { - #datasetContext?: typeof UMB_DATA_TYPE_DATASET_CONTEXT.TYPE; + #datasetContext?: typeof UMB_DATA_TYPE_VARIANT_CONTEXT.TYPE; /** * Data. The element will render configuration editors with values from this data. @@ -36,7 +36,7 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { super(); this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (instance) => { - this.#datasetContext = instance.createDatasetContext(this); + this.#datasetContext = instance.createPropertySetContext(this); this.observe(this.#datasetContext.properties, (properties) => { this._properties = properties as Array; }, 'observeProperties'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts index 26c0b81b43..56615a0f93 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts @@ -4,9 +4,9 @@ import { css, html, nothing, customElement, property, state, ifDefined } from '@ import { UmbWorkspaceSplitViewContext, UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, - UMB_VARIANT_DATASET_CONTEXT, + UMB_VARIANT_CONTEXT, ActiveVariant, - IsNameableDatasetContext, + IsNameablePropertySetContext, } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DocumentVariantResponseModel, ContentStateModel } from '@umbraco-cms/backoffice/backend-api'; @@ -27,7 +27,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { } #splitViewContext?: UmbWorkspaceSplitViewContext; - #datasetContext?: typeof UMB_VARIANT_DATASET_CONTEXT.TYPE; + #datasetContext?: typeof UMB_VARIANT_CONTEXT.TYPE; @state() private _name?: string; @@ -52,7 +52,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { this._observeVariants(); this._observeActiveVariants(); }); - this.consumeContext(UMB_VARIANT_DATASET_CONTEXT, (instance) => { + this.consumeContext(UMB_VARIANT_CONTEXT, (instance) => { this.#datasetContext = instance; this._observeDatasetContext(); }); @@ -123,7 +123,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { if (event instanceof UUIInputEvent) { const target = event.composedPath()[0] as UUIInputElement; - if (typeof target?.value === 'string' && this.#datasetContext && IsNameableDatasetContext(this.#datasetContext)) { + if (typeof target?.value === 'string' && this.#datasetContext && IsNameablePropertySetContext(this.#datasetContext)) { this.#datasetContext.setName(target.value); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts index e5ee3918eb..2f750067d6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts @@ -7,6 +7,10 @@ export class UmbVariantId { return Object.freeze(new UmbVariantId(variantData)); } + public static CreateInvariant(): UmbVariantId { + return Object.freeze(new UmbVariantId({})); + } + public readonly culture: string | null = null; public readonly segment: string | null = null; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts deleted file mode 100644 index f63ac17653..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { type UmbDatasetContext } from "./dataset-context.interface.js"; -import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; - -export const UMB_DATASET_CONTEXT = new UmbContextToken("UmbDatasetContext"); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts deleted file mode 100644 index 20bd533bae..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './dataset-context.interface.js'; -export * from './dataset-context.token.js'; -export * from './variant-dataset-context.interface.js'; -export * from './variant-dataset-context.token.js'; -export * from './nameable-dataset-context.interface.js'; -export * from './nameable-dataset-context.token.js'; -export * from './invariant-dataset-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.interface.ts deleted file mode 100644 index ee696a0ab8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { UmbDatasetContext } from "./dataset-context.interface.js"; - -/** - * A dataset with ability to set the name of it. -*/ -export interface UmbNameableDatasetContext extends UmbDatasetContext { - setName(name:string): void -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.token.ts deleted file mode 100644 index 57f439a0f6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/nameable-dataset-context.token.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type UmbDatasetContext } from "./dataset-context.interface.js"; -import { UmbNameableDatasetContext } from "./nameable-dataset-context.interface.js"; -import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; - -export const IsNameableDatasetContext = (context: UmbDatasetContext): context is UmbNameableDatasetContext => 'setName' in context; - -export const UMB_NAMEABLE_DATASET_CONTEXT = new UmbContextToken( - "UmbDatasetContext", - IsNameableDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts deleted file mode 100644 index 8877aa085b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { UmbDatasetContext } from "./dataset-context.interface.js"; -import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; - -/** - * A dataset context for a variant. - * - * @notes - * This one will depending on the origin of such deliver: - * - name - * - a variant id - * - a workspace reference - * - save state (this should depend on the workspace, this will become another superset of the dataset) - * - publish state (this should depend on the workspace, this will become another superset of the dataset) -*/ -export interface UmbVariantDatasetContext extends UmbDatasetContext { - getVariantId: () => UmbVariantId; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts deleted file mode 100644 index 0643aa530e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type UmbDatasetContext } from "./dataset-context.interface.js"; -import { UmbVariantDatasetContext } from "./variant-dataset-context.interface.js"; -import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; - -export const IsVariantDatasetContext = (context: UmbDatasetContext): context is UmbVariantDatasetContext => 'getVariantId' in context; - -export const UMB_VARIANT_DATASET_CONTEXT = new UmbContextToken( - "UmbDatasetContext", - IsVariantDatasetContext); 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 da8ba5fdeb..b03f096011 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,4 +1,4 @@ -export * from './dataset-context/index.js'; +export * from './variant-context/index.js'; export * from './workspace-action-menu/index.js'; export * from './workspace-action/index.js'; export * from './workspace-alias.condition.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/index.ts new file mode 100644 index 0000000000..8c2af922ab --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/index.ts @@ -0,0 +1,5 @@ +export * from './variant-context.interface.js'; +export * from './variant-context.token.js'; +export * from './nameable-variant-context.interface.js'; +export * from './nameable-variant-context.token.js'; +export * from './invariant-workspace-variant-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/invariant-workspace-variant-context.ts similarity index 79% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/invariant-workspace-variant-context.ts index bbf8d820fd..8eaeb84b17 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/invariant-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/invariant-workspace-variant-context.ts @@ -1,9 +1,10 @@ import { DocumentVariantResponseModel } from "@umbraco-cms/backoffice/backend-api"; import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; -import { UMB_DATASET_CONTEXT, UmbDatasetContext, UmbInvariantableWorkspaceContextInterface } from "@umbraco-cms/backoffice/workspace"; +import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; +import { UMB_VARIANT_CONTEXT, UmbVariantContext, UmbInvariantableWorkspaceContextInterface } from "@umbraco-cms/backoffice/workspace"; -export class UmbInvariantDatasetContext extends UmbBaseController implements UmbDatasetContext { +export class UmbInvariantWorkspaceVariantContext extends UmbBaseController implements UmbVariantContext { protected _workspace: WorkspaceType; @@ -16,11 +17,13 @@ export class UmbInvariantDatasetContext 'setName' in context; + +export const UMB_NAMEABLE_VARIANT_CONTEXT = new UmbContextToken( + "UmbVariantContext", + IsNameablePropertySetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/variant-context.interface.ts similarity index 89% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/variant-context.interface.ts index f3554750dd..48fe5bc9a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/variant-context.interface.ts @@ -2,7 +2,7 @@ import type { UmbVariantId } from "../../variant/variant-id.class.js"; import type { Observable } from "@umbraco-cms/backoffice/external/rxjs"; /** - * Represents a set of properties. + * A variant context, represents a set of properties. * This can take form as many, so to list a few: * - A specific variant of content * - Content that does not vary @@ -14,12 +14,12 @@ import type { Observable } from "@umbraco-cms/backoffice/external/rxjs"; * Others might have saved publishing status. * Also setting the name is an additional feature. */ -export interface UmbDatasetContext { +export interface UmbVariantContext { getType(): string; getUnique(): string | undefined; //getUniqueName(): string; - getVariantId?: (() => UmbVariantId | undefined); + getVariantId: (() => UmbVariantId); getName(): string | undefined; readonly name: Observable; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/variant-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/variant-context.token.ts new file mode 100644 index 0000000000..1827b68e81 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/variant-context.token.ts @@ -0,0 +1,4 @@ +import { type UmbVariantContext } from "./variant-context.interface.js"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; + +export const UMB_VARIANT_CONTEXT = new UmbContextToken("UmbVariantContext"); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts index 52ba72a7ac..ba55f834fe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts @@ -1,4 +1,4 @@ -import type { UmbDatasetContext } from '../dataset-context/dataset-context.interface.js'; +import type { UmbVariantContext } from '../variant-context/variant-context.interface.js'; import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -16,5 +16,5 @@ export interface UmbInvariantableWorkspaceContextInterface setPropertyValue(alias: string, value: unknown): Promise; // Dataset methods: - createDatasetContext(host: UmbControllerHost): UmbDatasetContext; + createPropertySetContext(host: UmbControllerHost): UmbVariantContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts index 26cbb15126..85ee93e1c8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts @@ -1,5 +1,5 @@ import type { UmbWorkspaceSplitViewManager } from '../workspace-split-view-manager.class.js'; -import type { UmbVariantDatasetContext } from '../dataset-context/variant-dataset-context.interface.js'; +import type { UmbVariantContext } from '../variant-context/variant-context.interface.js'; import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -25,5 +25,5 @@ export interface UmbVariantableWorkspaceContextInterface e //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; // Dataset methods: - createVariantDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbVariantDatasetContext; + createVariantPropertySetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbVariantContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts index 602f1690e7..609156706d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts @@ -1,6 +1,6 @@ import { UmbPropertyEditorExtensionElement } from '../../extension-registry/interfaces/property-editor-ui-extension-element.interface.js'; import { type WorkspacePropertyData } from '../types/workspace-property-data.type.js'; -import { UMB_DATASET_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UMB_VARIANT_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbBaseController, type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { @@ -47,12 +47,12 @@ export class UmbWorkspacePropertyContext extends UmbBaseControl private _variantDifference = new UmbStringState(undefined); public readonly variantDifference = this._variantDifference.asObservable(); - #datasetContext?: typeof UMB_DATASET_CONTEXT.TYPE; + #datasetContext?: typeof UMB_VARIANT_CONTEXT.TYPE; constructor(host: UmbControllerHostElement) { super(host); - this.consumeContext(UMB_DATASET_CONTEXT, (datasetContext) => { + this.consumeContext(UMB_VARIANT_CONTEXT, (datasetContext) => { this.#datasetContext = datasetContext; this._generateVariantDifferenceString(); this._observeProperty(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index 0dfdc9d390..5b42e90921 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -1,4 +1,4 @@ -import { UmbVariantDatasetContext } from '../dataset-context/index.js'; +import { UmbVariantContext } from '../variant-context/index.js'; import { UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN } from '../index.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { @@ -17,7 +17,7 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { return this.#workspaceContext; } - #dataSetContext?: UmbVariantDatasetContext; + #variantContext?: UmbVariantContext; #index = new UmbNumberState(undefined); index = this.#index.asObservable(); @@ -55,13 +55,13 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { // TODO: Ask workspace context to create the specific dataset. - this.#dataSetContext?.destroy(); + this.#variantContext?.destroy(); const variantId = UmbVariantId.Create(activeVariantInfo); // We can safely assume in this context that the workspace is variant. //if(variantId.isInvariant()) { - this.#dataSetContext = this.#workspaceContext?.createVariantDatasetContext(this, variantId); + this.#variantContext = this.#workspaceContext?.createVariantPropertySetContext(this, variantId); /*} else { - this.#dataSetContext = this.#workspaceContext?.createDatasetContext(this); + this.#variantContext = this.#workspaceContext?.createDatasetContext(this); }*/ }, '_observeActiveVariant' diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.token.ts deleted file mode 100644 index e47014995b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.token.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { UmbDocumentDatasetContext } from "./document-dataset-context.js"; -import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; -import { UmbDatasetContext } from "@umbraco-cms/backoffice/workspace"; - -export const IsDocumentDatasetContext = (context: UmbDatasetContext): context is UmbDocumentDatasetContext => context.getType() === 'document'; - -export const UMB_DOCUMENT_DATASET_CONTEXT = new UmbContextToken( - "UmbDatasetContext", - IsDocumentDatasetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.token.ts new file mode 100644 index 0000000000..cade2573c3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.token.ts @@ -0,0 +1,9 @@ +import type { UmbDocumentVariantContext } from "./document-variant-context.js"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; +import { UmbVariantContext } from "@umbraco-cms/backoffice/workspace"; + +export const IsDocumentVariantContext = (context: UmbVariantContext): context is UmbDocumentVariantContext => context.getType() === 'document'; + +export const UMB_DOCUMENT_VARIANT_CONTEXT = new UmbContextToken( + "UmbVariantContext", + IsDocumentVariantContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.ts index 1e50182daa..e69993b393 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.ts @@ -4,10 +4,10 @@ import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/co import { map } from "@umbraco-cms/backoffice/external/rxjs"; import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; -import { UMB_DATASET_CONTEXT, UmbVariantDatasetContext } from "@umbraco-cms/backoffice/workspace"; +import { UMB_VARIANT_CONTEXT, UmbVariantContext } from "@umbraco-cms/backoffice/workspace"; -// TODO: This code can be split into a UmbContentTypeDatasetContext, leaving just the publishing state and methods to this class. -export class UmbDocumentDatasetContext extends UmbBaseController implements UmbVariantDatasetContext { +// TODO: This code can be split into a UmbContentTypeVariantContext, leaving just the publishing state and methods to this class. +export class UmbDocumentVariantContext extends UmbBaseController implements UmbVariantContext { #workspace: UmbDocumentWorkspaceContext; #variantId: UmbVariantId; @@ -48,7 +48,7 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV constructor(host: UmbControllerHost, workspace: UmbDocumentWorkspaceContext, variantId: UmbVariantId) { // The controller alias, is a very generic name cause we want only one of these for this controller host. - super(host, 'dataSetContext'); + super(host, 'variantContext'); this.#workspace = workspace; this.#variantId = variantId; @@ -62,7 +62,7 @@ export class UmbDocumentDatasetContext extends UmbBaseController implements UmbV ); // TODO: Refactor: use the document dataset context token. - this.provideContext(UMB_DATASET_CONTEXT, this); + this.provideContext(UMB_VARIANT_CONTEXT, this); } 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 3222c3e6f7..49daa152eb 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 @@ -1,6 +1,6 @@ import { UmbDocumentRepository } from '../repository/document.repository.js'; import { UmbDocumentTypeRepository } from '../../document-types/repository/document-type.repository.js'; -import { UmbDocumentDatasetContext } from '../dataset-context/document-dataset-context.js'; +import { UmbDocumentVariantContext } from '../variant-context/document-variant-context.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import { @@ -8,7 +8,7 @@ import { UmbWorkspaceContext, UmbWorkspaceSplitViewManager, UmbVariantableWorkspaceContextInterface, - type UmbDatasetContext, + type UmbVariantContext, } from '@umbraco-cms/backoffice/workspace'; import type { CreateDocumentRequestModel, DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { @@ -208,12 +208,12 @@ export class UmbDocumentWorkspaceContext } */ - public createVariantDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { - return new UmbDocumentDatasetContext(host, this, variantId); + public createVariantPropertySetContext(host: UmbControllerHost, variantId: UmbVariantId) { + return new UmbDocumentVariantContext(host, this, variantId); } public createDatasetContext(host: UmbControllerHost) { - return new UmbDocumentDatasetContext(host, this, UmbVariantId.Create({})); + return new UmbDocumentVariantContext(host, this, UmbVariantId.Create({})); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts deleted file mode 100644 index c41307f186..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.token.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { UmbDataTypeDatasetContext } from "./data-type-dataset-context.js"; -import { UmbDatasetContext } from "@umbraco-cms/backoffice/workspace"; -import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; - -export const UMB_DATA_TYPE_DATASET_CONTEXT = new UmbContextToken( - "UmbDatasetContext", -(context): context is UmbDataTypeDatasetContext => 'properties' in context && context.getType() === 'data-type'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/index.ts deleted file mode 100644 index 6fe5f5301d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './data-type-dataset-context.token.js'; -export * from './data-type-dataset-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts index 879f9979af..59558cec93 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/index.ts @@ -3,4 +3,4 @@ import './components/index.js'; export type { UmbDataTypeModel } from './models.js'; export * from './entities.js'; export * from './repository/index.js'; -export * from './dataset-context/index.js'; +export * from './variant-context/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.token.ts new file mode 100644 index 0000000000..f10248bdd5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.token.ts @@ -0,0 +1,8 @@ +import type { UmbDataTypeVariantContext } from "./data-type-variant-context.js"; +import { UmbVariantContext } from "@umbraco-cms/backoffice/workspace"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; + +export const IsDataTypePropertySetContext = (context: UmbVariantContext): context is UmbDataTypeVariantContext => ('properties' in context && context.getType() === 'data-type'); + +export const UMB_DATA_TYPE_VARIANT_CONTEXT = new UmbContextToken( + "UmbVariantContext", IsDataTypePropertySetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.ts similarity index 62% rename from src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts rename to src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.ts index 372d1a11f1..506f8ef439 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/dataset-context/data-type-dataset-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.ts @@ -1,8 +1,8 @@ import { UmbDataTypeWorkspaceContext } from "../workspace/data-type-workspace.context.js"; import { UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; -import { UmbInvariantDatasetContext } from "@umbraco-cms/backoffice/workspace"; +import { UmbInvariantWorkspaceVariantContext } from "@umbraco-cms/backoffice/workspace"; -export class UmbDataTypeDatasetContext extends UmbInvariantDatasetContext { +export class UmbDataTypeVariantContext extends UmbInvariantWorkspaceVariantContext { properties = this._workspace.properties diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/index.ts new file mode 100644 index 0000000000..95cb72dcdc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/index.ts @@ -0,0 +1,2 @@ +export * from './data-type-variant-context.token.js'; +export * from './data-type-variant-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index 849aeed30c..3a6e0009da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbDataTypeRepository } from '../repository/data-type.repository.js'; -import { UmbDataTypeDatasetContext } from '../dataset-context/data-type-dataset-context.js'; +import { UmbDataTypeVariantContext } from '../variant-context/data-type-variant-context.js'; import { UmbInvariantableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; @@ -100,8 +100,8 @@ export class UmbDataTypeWorkspaceContext return this._configDefaultData?.find((x) => x.alias === alias)?.value; } - createDatasetContext(host: UmbControllerHost): UmbDataTypeDatasetContext { - return new UmbDataTypeDatasetContext(host, this); + createPropertySetContext(host: UmbControllerHost): UmbDataTypeVariantContext { + return new UmbDataTypeVariantContext(host, this); } async load(id: string) { diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx deleted file mode 100644 index 98b665c260..0000000000 --- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/dataset-context.mdx +++ /dev/null @@ -1,28 +0,0 @@ -import { Meta } from '@storybook/addon-docs'; - - - -# Dataset Context - -The dataset context is a context which holds the data for a set of properties. -Property Editors UIs requires the dataset context to be present to work. This enables Property Editor UIs to have a generic relation with its ownership. - -The Dataset context holds a name and a set of properties. What makes a property can vary but we require a alias and a value. - -## Dataset in relation to Property Editors and Workspaces. - -A dataset context is the connection point between a Property Editor and a Workspace. - -The hirachy is as follows: -- Workspace Context - - Dataset Context - - Property Editor UIs - -A dataset covers a set of properties, in some cases a workspace then needs to have multiple datasets. An example of such is variants of the Document Workspace. Each variant have their own dataset. - -## Setup a Dataset context - -It would be good to have examples for developers to see how to setup a dataset context, in code. (This might need to be a tutorial demonstrating implementing a simple workspace with a dataset with Property Editor UIs) diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/variant-context.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/variant-context.mdx new file mode 100644 index 0000000000..9d4372fa45 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/variant-context.mdx @@ -0,0 +1,28 @@ +import { Meta } from '@storybook/addon-docs'; + + + +# Variant Context + +The Variant Context is a context that holds the data for a set of properties. +Property Editors UIs require the Variant Context to be present to work. This enables Property Editor UIs to have a generic relation with its ownership. + +The Variant context holds a name and a set of properties. What makes a property can vary but we require an alias and a value. + +## Variant Context concerning Property Editors and Workspaces. + +A Variant Vontext is the connection point between a Property Editor and a Workspace. + +The hierarchy is as follows: +- Workspace Context + - Variant Context + - Property Editor UIs + +A variant context covers a set of properties, in some cases a workspace then needs to have multiple variants. An example of such is Document Workspace. Each variant has their own set of properties and their own name. + +## Setup a Variant Context + +It would be good to have examples for developers to see how to set up a Variant Context, in code. (This might need to be a tutorial demonstrating implementing a simple workspace with a dataset with Property Editor UIs) From 2c7e12274cfb632df12b530b37b0e2e8d2fefc56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 4 Sep 2023 21:25:43 +0200 Subject: [PATCH 67/75] rename to extensionRegistry --- .../src/apps/backoffice/backoffice.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5ecac14cc1..5a3a6ceb62 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 @@ -35,7 +35,7 @@ export class UmbBackofficeElement extends UmbLitElement { * This enables to registerer og unregister extensions via DevTools, or just via querying this element via the DOM. * @type {UmbExtensionsRegistry} */ - public registry = umbExtensionsRegistry; + public extensionRegistry = umbExtensionsRegistry; constructor() { super(); From c50bad1fc416475014cb226e8848527808a1912d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 09:42:50 +0200 Subject: [PATCH 68/75] rename dataset to variant --- .../property-editor-config.element.ts | 6 ++--- .../variant-selector.element.ts | 14 ++++++------ .../workspace-property.context.ts | 22 +++++++++---------- .../workspace-split-view.context.ts | 4 ++-- .../stories/extending/variant-context.mdx | 6 ++--- .../stories/extending/workspaces/context.mdx | 8 +++---- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 0c7a237dcf..812e1bd7f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -16,7 +16,7 @@ import { UMB_DATA_TYPE_VARIANT_CONTEXT } from '@umbraco-cms/backoffice/data-type @customElement('umb-property-editor-config') export class UmbPropertyEditorConfigElement extends UmbLitElement { - #datasetContext?: typeof UMB_DATA_TYPE_VARIANT_CONTEXT.TYPE; + #variantContext?: typeof UMB_DATA_TYPE_VARIANT_CONTEXT.TYPE; /** * Data. The element will render configuration editors with values from this data. @@ -36,8 +36,8 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { super(); this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (instance) => { - this.#datasetContext = instance.createPropertySetContext(this); - this.observe(this.#datasetContext.properties, (properties) => { + this.#variantContext = instance.createPropertySetContext(this); + this.observe(this.#variantContext.properties, (properties) => { this._properties = properties as Array; }, 'observeProperties'); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts index 56615a0f93..0e564655c7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts @@ -27,7 +27,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { } #splitViewContext?: UmbWorkspaceSplitViewContext; - #datasetContext?: typeof UMB_VARIANT_CONTEXT.TYPE; + #variantContext?: typeof UMB_VARIANT_CONTEXT.TYPE; @state() private _name?: string; @@ -53,7 +53,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { this._observeActiveVariants(); }); this.consumeContext(UMB_VARIANT_CONTEXT, (instance) => { - this.#datasetContext = instance; + this.#variantContext = instance; this._observeDatasetContext(); }); } @@ -93,15 +93,15 @@ export class UmbVariantSelectorElement extends UmbLitElement { } private async _observeDatasetContext() { - if (!this.#datasetContext) return; + if (!this.#variantContext) return; - const variantId = this.#datasetContext.getVariantId(); + const variantId = this.#variantContext.getVariantId(); this._culture = variantId.culture; this._segment = variantId.segment; this.updateVariantDisplayName(); this.observe( - this.#datasetContext.name, + this.#variantContext.name, (name) => { this._name = name; }, @@ -123,8 +123,8 @@ export class UmbVariantSelectorElement extends UmbLitElement { if (event instanceof UUIInputEvent) { const target = event.composedPath()[0] as UUIInputElement; - if (typeof target?.value === 'string' && this.#datasetContext && IsNameablePropertySetContext(this.#datasetContext)) { - this.#datasetContext.setName(target.value); + if (typeof target?.value === 'string' && this.#variantContext && IsNameablePropertySetContext(this.#variantContext)) { + this.#variantContext.setName(target.value); } } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts index 609156706d..40974c4afe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts @@ -47,13 +47,13 @@ export class UmbWorkspacePropertyContext extends UmbBaseControl private _variantDifference = new UmbStringState(undefined); public readonly variantDifference = this._variantDifference.asObservable(); - #datasetContext?: typeof UMB_VARIANT_CONTEXT.TYPE; + #variantContext?: typeof UMB_VARIANT_CONTEXT.TYPE; constructor(host: UmbControllerHostElement) { super(host); - this.consumeContext(UMB_VARIANT_CONTEXT, (datasetContext) => { - this.#datasetContext = datasetContext; + this.consumeContext(UMB_VARIANT_CONTEXT, (variantContext) => { + this.#variantContext = variantContext; this._generateVariantDifferenceString(); this._observeProperty(); }); @@ -78,9 +78,9 @@ export class UmbWorkspacePropertyContext extends UmbBaseControl private _observePropertyValue?: UmbObserverController; private async _observeProperty() { const alias = this.#data.getValue().alias; - if (!this.#datasetContext || !alias) return; + if (!this.#variantContext || !alias) return; - const variantIdSubject = await this.#datasetContext.propertyVariantId?.(alias) ?? undefined; + const variantIdSubject = await this.#variantContext.propertyVariantId?.(alias) ?? undefined; this._observePropertyVariant?.destroy(); if(variantIdSubject) { this._observePropertyVariant = this.observe( @@ -92,7 +92,7 @@ export class UmbWorkspacePropertyContext extends UmbBaseControl } // TODO: Verify if we need to optimize runtime by parsing the propertyVariantID, cause this method retrieves it again: - const subject = await this.#datasetContext.propertyValueByAlias(alias) + const subject = await this.#variantContext.propertyValueByAlias(alias) this._observePropertyValue?.destroy(); if(subject) { @@ -107,10 +107,10 @@ export class UmbWorkspacePropertyContext extends UmbBaseControl } private _generateVariantDifferenceString() { - if(!this.#datasetContext) return; - const datasetVariantId = this.#datasetContext.getVariantId?.() ?? undefined; + if(!this.#variantContext) return; + const contextVariantId = this.#variantContext.getVariantId?.() ?? undefined; this._variantDifference.next( - datasetVariantId ? this.#variantId.getValue()?.toDifferencesString(datasetVariantId) : '' + contextVariantId ? this.#variantId.getValue()?.toDifferencesString(contextVariantId) : '' ); } @@ -126,9 +126,9 @@ export class UmbWorkspacePropertyContext extends UmbBaseControl // TODO: Refactor: consider rename to setValue: public changeValue(value: WorkspacePropertyData['value']) { const alias = this.#data.getValue().alias; - if (!this.#datasetContext || !alias) return; + if (!this.#variantContext || !alias) return; - this.#datasetContext?.setPropertyValue(alias, value); + this.#variantContext?.setPropertyValue(alias, value); } public setConfig(config: WorkspacePropertyData['config'] | undefined) { this.#data.update({ config }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index 5b42e90921..02333e7a67 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -47,13 +47,13 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { const index = this.#index.getValue(); if (index === undefined) return; - // TODO: Should splitView be put into its own context?... a split view manager context? one which might have a reference to the workspace context, so we still can ask that about how to create the dataset context. + // TODO: Should splitView be put into its own context?... a split view manager context? one which might have a reference to the workspace context, so we still can ask that about how to create the variant context. this.observe( this.#workspaceContext.splitView.activeVariantByIndex(index), async (activeVariantInfo) => { if (!activeVariantInfo) return; - // TODO: Ask workspace context to create the specific dataset. + // TODO: Ask workspace context to create the specific variant context. this.#variantContext?.destroy(); const variantId = UmbVariantId.Create(activeVariantInfo); diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/variant-context.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/variant-context.mdx index 9d4372fa45..98a085344b 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/variant-context.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/variant-context.mdx @@ -14,15 +14,15 @@ The Variant context holds a name and a set of properties. What makes a property ## Variant Context concerning Property Editors and Workspaces. -A Variant Vontext is the connection point between a Property Editor and a Workspace. +A Variant Context is the connection point between a Property Editor and a Workspace. The hierarchy is as follows: - Workspace Context - Variant Context - Property Editor UIs -A variant context covers a set of properties, in some cases a workspace then needs to have multiple variants. An example of such is Document Workspace. Each variant has their own set of properties and their own name. +A variant context covers a set of properties, in some cases a workspace then needs to have multiple variants. An example of such is Document Workspace. Each variant has its own set of properties and a name. ## Setup a Variant Context -It would be good to have examples for developers to see how to set up a Variant Context, in code. (This might need to be a tutorial demonstrating implementing a simple workspace with a dataset with Property Editor UIs) +It would be good to have examples for developers to see how to set up a Variant Context, in code. (This might need to be a tutorial demonstrating implementing a simple workspace with a variant with Property Editor UIs) diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/workspaces/context.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/workspaces/context.mdx index 74cc0c9907..cb9e6a0b86 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/workspaces/context.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/workspaces/context.mdx @@ -8,14 +8,14 @@ import { Meta } from '@storybook/addon-docs'; # Workspace Context A Workspace context is a container for the data of a workspace. It is a wrapper around the data of the entity that the workspace is working on. It is also responsible for loading and saving the data to the server. -TODO: extend the description of a workspace +TODO: Extend the description of a workspace (rough notes) -- A workspace context knows about its entity type (e.g. content, media, member, etc.) and holds its unique string (ex: key). -- Most workspaces contexts holds a draft state of its entities data. It is a copy of the entity data that can be modified at runtime and send to the server to be saved. +- A workspace context knows about its entity type (e.g. content, media, member, etc.) and holds its unique string (e.g.: key). +- Most workspaces contexts hold a draft state of its entity data. It is a copy of the entity data that can be modified at runtime and sent to the server to be saved. -If a workspace wants to utilize Property Editor UIs, then it must provide a dataset context for the property editors. The dataset is the generic interface between workspace and property editors. See dataset contexts for more info. +If a workspace wants to utilize Property Editor UIs, then it must provide a variant context for the property editors. The variant-context is the generic interface between workspace and property editors. See variant contexts for more info. TODO: More points and examples: From 7a131dd399abd958b82e5b13ce3d45052efe709b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 09:45:07 +0200 Subject: [PATCH 69/75] Update src/apps/backoffice/backoffice.element.ts Co-authored-by: Mads Rasmussen --- .../src/apps/backoffice/backoffice.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5a3a6ceb62..86cd693f0b 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 @@ -32,7 +32,7 @@ export class UmbBackofficeElement extends UmbLitElement { /** * Backoffice extension registry. - * This enables to registerer og unregister extensions via DevTools, or just via querying this element via the DOM. + * This enables to register and unregister extensions via DevTools, or just via querying this element via the DOM. * @type {UmbExtensionsRegistry} */ public extensionRegistry = umbExtensionsRegistry; From 0241b2dafac5014f262d477e430bc2846b42d698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 09:46:17 +0200 Subject: [PATCH 70/75] rename create methods --- .../property-editor-config/property-editor-config.element.ts | 2 +- .../workspace-invariantable-context.interface.ts | 2 +- .../workspace-variantable-context.interface.ts | 2 +- .../workspace-split-view/workspace-split-view.context.ts | 2 +- .../documents/documents/workspace/document-workspace.context.ts | 2 +- .../data-types/workspace/data-type-workspace.context.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 812e1bd7f6..8bac2d6a9f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -36,7 +36,7 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { super(); this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (instance) => { - this.#variantContext = instance.createPropertySetContext(this); + this.#variantContext = instance.createInvariantVariantContext(this); this.observe(this.#variantContext.properties, (properties) => { this._properties = properties as Array; }, 'observeProperties'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts index ba55f834fe..43ee103b87 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts @@ -16,5 +16,5 @@ export interface UmbInvariantableWorkspaceContextInterface setPropertyValue(alias: string, value: unknown): Promise; // Dataset methods: - createPropertySetContext(host: UmbControllerHost): UmbVariantContext; + createInvariantVariantContext(host: UmbControllerHost): UmbVariantContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts index 85ee93e1c8..5163d6c4aa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts @@ -25,5 +25,5 @@ export interface UmbVariantableWorkspaceContextInterface e //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; // Dataset methods: - createVariantPropertySetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbVariantContext; + createVariantVariantContext(host: UmbControllerHost, variantId: UmbVariantId): UmbVariantContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index 02333e7a67..e32cce2ac0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -59,7 +59,7 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { const variantId = UmbVariantId.Create(activeVariantInfo); // We can safely assume in this context that the workspace is variant. //if(variantId.isInvariant()) { - this.#variantContext = this.#workspaceContext?.createVariantPropertySetContext(this, variantId); + this.#variantContext = this.#workspaceContext?.createVariantVariantContext(this, variantId); /*} else { this.#variantContext = this.#workspaceContext?.createDatasetContext(this); }*/ 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 49daa152eb..c1bc00283a 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 @@ -208,7 +208,7 @@ export class UmbDocumentWorkspaceContext } */ - public createVariantPropertySetContext(host: UmbControllerHost, variantId: UmbVariantId) { + public createVariantVariantContext(host: UmbControllerHost, variantId: UmbVariantId) { return new UmbDocumentVariantContext(host, this, variantId); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index 3a6e0009da..fb32520faf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -100,7 +100,7 @@ export class UmbDataTypeWorkspaceContext return this._configDefaultData?.find((x) => x.alias === alias)?.value; } - createPropertySetContext(host: UmbControllerHost): UmbDataTypeVariantContext { + createInvariantVariantContext(host: UmbControllerHost): UmbDataTypeVariantContext { return new UmbDataTypeVariantContext(host, this); } From 42f70882fbffe4f9d5c629cba263b592e05298cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 10:02:54 +0200 Subject: [PATCH 71/75] createVariantContext --- .../property-editor-config.element.ts | 5 ++--- .../workspace/workspace-context/workspace-context.ts | 1 + .../workspace-invariantable-context.interface.ts | 10 +++++----- .../workspace-variantable-context.interface.ts | 7 +++---- .../workspace-property/workspace-property.element.ts | 1 - .../workspace-split-view.context.ts | 7 +------ .../variant-context/document-variant-context.ts | 4 ++-- .../documents/workspace/document-workspace.context.ts | 6 +----- .../workspace/data-type-workspace-editor.element.ts | 1 + .../workspace/data-type-workspace.context.ts | 2 +- 10 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 8bac2d6a9f..87e8811df1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -1,4 +1,3 @@ -import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from '../../../settings/data-types/workspace/data-type-workspace.context.js'; import { html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { @@ -35,8 +34,8 @@ export class UmbPropertyEditorConfigElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (instance) => { - this.#variantContext = instance.createInvariantVariantContext(this); + this.consumeContext(UMB_DATA_TYPE_VARIANT_CONTEXT, (instance) => { + this.#variantContext = instance; this.observe(this.#variantContext.properties, (properties) => { this._properties = properties as Array; }, 'observeProperties'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts index d96a6fd155..790f96c653 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts @@ -60,4 +60,5 @@ export abstract class UmbWorkspaceContext; + } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts index 43ee103b87..07a16286ea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-context.interface.ts @@ -1,7 +1,8 @@ -import type { UmbVariantContext } from '../variant-context/variant-context.interface.js'; +import { UmbVariantId } from '../../variant/variant-id.class.js'; +import { UmbVariantContext } from '../variant-context/variant-context.interface.js'; import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbInvariantableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { @@ -14,7 +15,6 @@ export interface UmbInvariantableWorkspaceContextInterface propertyValueByAlias(alias: string): Promise>; getPropertyValue(alias: string): ReturnType; setPropertyValue(alias: string, value: unknown): Promise; - - // Dataset methods: - createInvariantVariantContext(host: UmbControllerHost): UmbVariantContext; + + createVariantContext(host: UmbControllerHost, variantId?: UmbVariantId): UmbVariantContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts index 5163d6c4aa..3ce0dd3238 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variantable-context.interface.ts @@ -1,10 +1,10 @@ import type { UmbWorkspaceSplitViewManager } from '../workspace-split-view-manager.class.js'; -import type { UmbVariantContext } from '../variant-context/variant-context.interface.js'; +import { UmbVariantContext } from '../variant-context/variant-context.interface.js'; import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { VariantResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbVariantableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { @@ -24,6 +24,5 @@ export interface UmbVariantableWorkspaceContextInterface e setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId): Promise; //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; - // Dataset methods: - createVariantVariantContext(host: UmbControllerHost, variantId: UmbVariantId): UmbVariantContext; + createVariantContext(host: UmbControllerHost, variantId?: UmbVariantId): UmbVariantContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts index 739470ab2f..6e0231df34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.element.ts @@ -208,7 +208,6 @@ export class UmbWorkspacePropertyElement extends UmbLitElement { ? html`` : ''}`; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index e32cce2ac0..7c7136367b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -57,12 +57,7 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { this.#variantContext?.destroy(); const variantId = UmbVariantId.Create(activeVariantInfo); - // We can safely assume in this context that the workspace is variant. - //if(variantId.isInvariant()) { - this.#variantContext = this.#workspaceContext?.createVariantVariantContext(this, variantId); - /*} else { - this.#variantContext = this.#workspaceContext?.createDatasetContext(this); - }*/ + this.#variantContext = this.#workspaceContext?.createVariantContext(this, variantId); }, '_observeActiveVariant' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.ts index e69993b393..2e894b719f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/variant-context/document-variant-context.ts @@ -46,11 +46,11 @@ export class UmbDocumentVariantContext extends UmbBaseController implements UmbV - constructor(host: UmbControllerHost, workspace: UmbDocumentWorkspaceContext, variantId: UmbVariantId) { + constructor(host: UmbControllerHost, workspace: UmbDocumentWorkspaceContext, variantId?: UmbVariantId) { // The controller alias, is a very generic name cause we want only one of these for this controller host. super(host, 'variantContext'); this.#workspace = workspace; - this.#variantId = variantId; + this.#variantId = variantId ?? UmbVariantId.CreateInvariant(); this.observe( this.#workspace.variantById(this.#variantId), 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 c1bc00283a..6e6458a254 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 @@ -208,14 +208,10 @@ export class UmbDocumentWorkspaceContext } */ - public createVariantVariantContext(host: UmbControllerHost, variantId: UmbVariantId) { + public createVariantContext(host: UmbControllerHost, variantId: UmbVariantId) { return new UmbDocumentVariantContext(host, this, variantId); } - public createDatasetContext(host: UmbControllerHost) { - return new UmbDocumentVariantContext(host, this, UmbVariantId.Create({})); - } - public destroy(): void { this.#currentData.complete(); this.structure.destroy(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts index c78e61f20b..189c333ede 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace-editor.element.ts @@ -23,6 +23,7 @@ export class UmbDataTypeWorkspaceEditorElement extends UmbLitElement { this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, (workspaceContext) => { this.#workspaceContext = workspaceContext; + this.#workspaceContext?.createVariantContext(this); this.#observeIsNew(); this.#observeName(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index fb32520faf..4df074b8e9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -100,7 +100,7 @@ export class UmbDataTypeWorkspaceContext return this._configDefaultData?.find((x) => x.alias === alias)?.value; } - createInvariantVariantContext(host: UmbControllerHost): UmbDataTypeVariantContext { + createVariantContext(host: UmbControllerHost): UmbDataTypeVariantContext { return new UmbDataTypeVariantContext(host, this); } From 1ee13490bc66dbd5c49dac0e8ed3fa034ffd5212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 10:09:19 +0200 Subject: [PATCH 72/75] isDataTypeVariantContext --- .../variant-context/data-type-variant-context.token.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.token.ts index f10248bdd5..2bd6edee08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/variant-context/data-type-variant-context.token.ts @@ -2,7 +2,7 @@ import type { UmbDataTypeVariantContext } from "./data-type-variant-context.js"; import { UmbVariantContext } from "@umbraco-cms/backoffice/workspace"; import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; -export const IsDataTypePropertySetContext = (context: UmbVariantContext): context is UmbDataTypeVariantContext => ('properties' in context && context.getType() === 'data-type'); +export const isDataTypeVariantContext = (context: UmbVariantContext): context is UmbDataTypeVariantContext => ('properties' in context && context.getType() === 'data-type'); export const UMB_DATA_TYPE_VARIANT_CONTEXT = new UmbContextToken( - "UmbVariantContext", IsDataTypePropertySetContext); + "UmbVariantContext", isDataTypeVariantContext); From 304f3faf5acf59f6e12e9e78b9fba72c04673ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 10:09:26 +0200 Subject: [PATCH 73/75] clean up --- .../workspace-split-view/workspace-split-view.context.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts index 7c7136367b..b408e5ec7d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-split-view/workspace-split-view.context.ts @@ -80,12 +80,6 @@ export class UmbWorkspaceSplitViewContext extends UmbBaseController { this.#workspaceContext?.splitView.openSplitView(variant); } - public changeVariant(culture: string | null, segment: string | null) { - const index = this.#index.getValue(); - if (index === undefined) return; - this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); - } - public getSplitViewIndex() { return this.#index.getValue(); } From 8c24739b35e849f0ec1efeeed20c7d59c6c3be95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 10:28:33 +0200 Subject: [PATCH 74/75] more corrections --- .../variant-selector/variant-selector.element.ts | 8 ++++---- .../variant-context/nameable-variant-context.token.ts | 4 ++-- .../property-structure-workspace-context.interface.ts | 2 +- .../documents/workspace/document-workspace.context.ts | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts index 0e564655c7..35bf057f7d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts @@ -6,7 +6,7 @@ import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, UMB_VARIANT_CONTEXT, ActiveVariant, - IsNameablePropertySetContext, + isNameablePropertySetContext, } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DocumentVariantResponseModel, ContentStateModel } from '@umbraco-cms/backoffice/backend-api'; @@ -54,7 +54,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { }); this.consumeContext(UMB_VARIANT_CONTEXT, (instance) => { this.#variantContext = instance; - this._observeDatasetContext(); + this._observeVariantContext(); }); } @@ -92,7 +92,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { } } - private async _observeDatasetContext() { + private async _observeVariantContext() { if (!this.#variantContext) return; const variantId = this.#variantContext.getVariantId(); @@ -123,7 +123,7 @@ export class UmbVariantSelectorElement extends UmbLitElement { if (event instanceof UUIInputEvent) { const target = event.composedPath()[0] as UUIInputElement; - if (typeof target?.value === 'string' && this.#variantContext && IsNameablePropertySetContext(this.#variantContext)) { + if (typeof target?.value === 'string' && this.#variantContext && isNameablePropertySetContext(this.#variantContext)) { this.#variantContext.setName(target.value); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/nameable-variant-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/nameable-variant-context.token.ts index a8aae51711..307962082f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/nameable-variant-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/nameable-variant-context.token.ts @@ -2,8 +2,8 @@ import { type UmbVariantContext } from "./variant-context.interface.js"; import { UmbNameableVariantContext } from "./nameable-variant-context.interface.js"; import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; -export const IsNameablePropertySetContext = (context: UmbVariantContext): context is UmbNameableVariantContext => 'setName' in context; +export const isNameablePropertySetContext = (context: UmbVariantContext): context is UmbNameableVariantContext => 'setName' in context; export const UMB_NAMEABLE_VARIANT_CONTEXT = new UmbContextToken( "UmbVariantContext", - IsNameablePropertySetContext); + isNameablePropertySetContext); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts index e0698d4cf6..5826e02d2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts @@ -5,6 +5,6 @@ import type { ValueModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; export interface UmbPropertyStructureWorkspaceContextInterface extends UmbWorkspaceContextInterface { - propertyDataById(id: string): Promise>; + propertyStructureById(id: string): Promise>; } 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 6e6458a254..c4fbfb841a 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 @@ -135,7 +135,7 @@ export class UmbDocumentWorkspaceContext this.#currentData.update({ variants }); } - async propertyDataById(propertyId: string) { + async propertyStructureById(propertyId: string) { return this.structure.propertyStructureById(propertyId); } From 4da0c3a3883c7b349695aae61f319b12fdf41c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 10:52:51 +0200 Subject: [PATCH 75/75] comment for future refactor --- .../property-editor-config/property-editor-config.element.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts index 87e8811df1..63100256b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/property-editor-config/property-editor-config.element.ts @@ -15,6 +15,7 @@ import { UMB_DATA_TYPE_VARIANT_CONTEXT } from '@umbraco-cms/backoffice/data-type @customElement('umb-property-editor-config') export class UmbPropertyEditorConfigElement extends UmbLitElement { + // TODO: Make this element generic, so its not bound to DATA-TYPEs. This will require moving some functionality of Data-Type-Context to this. and this might need to self provide a variant Context for its inner property editor UIs. #variantContext?: typeof UMB_DATA_TYPE_VARIANT_CONTEXT.TYPE; /**