From b4fd4a3840f0de608ae7757209edcecc69ab04f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 26 Jun 2024 11:07:49 +0200 Subject: [PATCH 01/23] 404 route --- .../src/assets/lang/en-us.ts | 4 ++ .../src/external/router-slot/router-slot.ts | 25 ++++++++- .../block/block-grid/workspace/manifests.ts | 2 +- .../block-grid/workspace/views/manifests.ts | 4 +- .../block/block/workspace/manifests.ts | 4 ++ .../core/router/router-slot.element.ts | 3 +- .../workspace-editor.element.ts | 15 ++--- .../workspace-fallback-view.element.ts | 56 +++++++++++++++++++ 8 files changed, 96 insertions(+), 17 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-views/workspace-fallback-view.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts index 511f97480e..42b706954f 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts @@ -2524,4 +2524,8 @@ export default { detailedLevelDescription: '\n We will send:\n \n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n
By choosing "Detailed" you agree to current and future anonymized information being collected.
\n ', }, + routing: { + routeNotFoundTitle: 'Not found', + routeNotFoundDescription: 'The requested route could not be found. Please check the URL and try again.' + } } as UmbLocalizationDictionary; diff --git a/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts b/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts index 6f8e91af83..4bf3e5d5e5 100644 --- a/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts +++ b/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts @@ -197,8 +197,16 @@ export class RouterSlot extends HTMLElement implements IRouter this._routes.push(...routes); if (navigate === undefined) { - // If navigate is not determined, then we will check if we have a route match. If not then we will re-render. + // If navigate is not determined, then we will check if we have a route match. If not then we will re-render. [NL] navigate = this._routeMatch === null; + if (navigate === false) { + const newMatch = this.getRouteMatch(); + console.log("new match...", newMatch) + // Check if match is still present? [NL] + // Check if there is a better/different match? [NL] + // Maybe both are handled in this approach? [NL] + navigate = this._routeMatch !== newMatch; + } } // Navigate fallback: @@ -206,6 +214,7 @@ export class RouterSlot extends HTMLElement implements IRouter // Register that the path has changed so the correct route can be loaded. if (navigate) { + console.log("navigate...") this.render(); } } @@ -232,13 +241,21 @@ export class RouterSlot extends HTMLElement implements IRouter // Either choose the parent fragment or the current path if no parent exists. // The root router slot will always use the entire path. - const pathFragment = - this.parent != null && this.parent.fragments != null ? this.parent.fragments.rest : pathWithoutBasePath(); + const pathFragment = this.getPathFragment(); // Route to the path await this.renderPath(pathFragment); } + protected getPathFragment() { + return this.parent != null && this.parent.fragments != null ? this.parent.fragments.rest : pathWithoutBasePath(); + } + + protected getRouteMatch() { + // Find the corresponding route. + return matchRoutes(this._routes, this.getPathFragment()); + } + /** * Attaches listeners, either globally or on the parent router. */ @@ -296,6 +313,8 @@ export class RouterSlot extends HTMLElement implements IRouter * Returns true if a navigation was made to a new page. */ protected async renderPath(path: string | PathFragment): Promise { + + // Notice: Since this is never called from any other place than one higher in this file(when writing this...), we could just retrieve the path and find a match by using this.getRouteMatch() [NL] // Find the corresponding route. const match = matchRoutes(this._routes, path); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/manifests.ts index 09c4468799..f7b94148ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/manifests.ts @@ -1,6 +1,6 @@ +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; import { manifests as workspaceViewManifests } from './views/manifests.js'; import { UMB_BLOCK_GRID_TYPE_WORKSPACE_ALIAS } from './index.js'; -import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ ...workspaceViewManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts index e50774cc26..2d55fb84c3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts @@ -1,5 +1,5 @@ -import { UMB_BLOCK_GRID_TYPE_WORKSPACE_ALIAS } from '../index.js'; import type { ManifestTypes, ManifestWorkspaceView } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_BLOCK_GRID_TYPE_WORKSPACE_ALIAS } from '../index.js'; export const workspaceViews: Array = [ { @@ -53,7 +53,7 @@ export const workspaceViews: Array = [ { alias: 'Umb.Condition.WorkspaceAlias', match: UMB_BLOCK_GRID_TYPE_WORKSPACE_ALIAS, - }, + } ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts index 8b25bde2eb..b5078f80de 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts @@ -76,6 +76,10 @@ export const manifests: Array = [ { alias: 'Umb.Condition.BlockWorkspaceHasSettings', }, + { + alias: 'Umb.Condition.Switch', + frequency: '2000000000' + } ], } as any, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/router-slot.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/router-slot.element.ts index 019d1324f0..7d62a52f1c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/router/router-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/router-slot.element.ts @@ -28,7 +28,8 @@ export class UmbRouterSlotElement extends UmbLitElement { value ??= []; const oldValue = this.#router.routes; if ( - value.filter((route) => (oldValue ? oldValue.findIndex((r) => r.path === route.path) === -1 : true)).length > 0 + value.length !== oldValue?.length || + value.filter((route) => (oldValue?.findIndex((r) => r.path === route.path) === -1)).length > 0 ) { this.#router.routes = value; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts index cd43be73f3..43640abca6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts @@ -70,18 +70,13 @@ export class UmbWorkspaceEditorElement extends UmbLitElement { }, } as UmbRoute; }); - - // If we have a post fix then we need to add a direct from the empty url of the split-view-index: - // TODO: This is problematic, cause if a workspaceView appears later, then this takes over. And it is also a problem if it does not use redirect, but just a view defined with and empty path. - const firstRoute = newRoutes[0]; - if (firstRoute) { - newRoutes.push({ - path: ``, - redirectTo: firstRoute.path, - }); - } } + newRoutes.push({ + path: `**`, + component: () => import('../workspace-views/workspace-fallback-view.element.js'), + }); + this._routes = newRoutes; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-views/workspace-fallback-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-views/workspace-fallback-view.element.ts new file mode 100644 index 0000000000..231ee4a5ea --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-views/workspace-fallback-view.element.ts @@ -0,0 +1,56 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +/** + * A fallback view to be used in Workspace Views, maybe this can be upgraded at a later point. + */ +// TODO: Rename and move this file to a more generic place. +@customElement('umb-workspace-fallback-view') +export class UmbWorkspaceFallbackViewElement extends UmbLitElement { + + override render() { + return html` +
+

+ +
+ `; + } + + static override styles = [ + UmbTextStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + min-width: 0; + } + + :host > div { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 100%; + opacity: 0; + animation: fadeIn 4s .2s forwards; + } + + @keyframes fadeIn { + 100% { + opacity: 100%; + } + } + `, + ]; +} + +export default UmbWorkspaceFallbackViewElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-workspace-fallback-view': UmbWorkspaceFallbackViewElement; + } +} From 0b94544f5796db9d127e20f15c1a7ff62668b341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 09:49:54 +0200 Subject: [PATCH 02/23] general not found element --- .../src/packages/block/block/workspace/manifests.ts | 6 +++--- .../components/not-found/route-not-found.element.ts} | 8 ++++---- .../src/packages/core/router/index.ts | 1 + .../workspace-editor/workspace-editor.element.ts | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/{workspace/components/workspace-views/workspace-fallback-view.element.ts => router/components/not-found/route-not-found.element.ts} (82%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts index b5078f80de..1249f74d6d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts @@ -24,7 +24,7 @@ export const manifests: Array = [ { type: 'workspace', kind: 'routable', - name: 'Block List Type Workspace', + name: 'Block Workspace', alias: UMB_BLOCK_WORKSPACE_ALIAS, api: () => import('./block-workspace.context.js'), meta: { @@ -61,7 +61,7 @@ export const manifests: Array = [ alias: 'Umb.WorkspaceView.Block.Settings', name: 'Block Workspace Settings View', js: () => import('./views/edit/block-workspace-view-edit.element.js'), - weight: 1000, + weight: 900, meta: { label: '#general_settings', pathname: 'settings', @@ -78,7 +78,7 @@ export const manifests: Array = [ }, { alias: 'Umb.Condition.Switch', - frequency: '2000000000' + frequency: '2000' } ], } as any, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-views/workspace-fallback-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/components/not-found/route-not-found.element.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-views/workspace-fallback-view.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/router/components/not-found/route-not-found.element.ts index 231ee4a5ea..9f57591368 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-views/workspace-fallback-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/components/not-found/route-not-found.element.ts @@ -6,8 +6,8 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; * A fallback view to be used in Workspace Views, maybe this can be upgraded at a later point. */ // TODO: Rename and move this file to a more generic place. -@customElement('umb-workspace-fallback-view') -export class UmbWorkspaceFallbackViewElement extends UmbLitElement { +@customElement('umb-route-not-found') +export class UmbRouteNotFoundElement extends UmbLitElement { override render() { return html` @@ -47,10 +47,10 @@ export class UmbWorkspaceFallbackViewElement extends UmbLitElement { ]; } -export default UmbWorkspaceFallbackViewElement; +export default UmbRouteNotFoundElement; declare global { interface HTMLElementTagNameMap { - 'umb-workspace-fallback-view': UmbWorkspaceFallbackViewElement; + 'umb-route-not-found': UmbRouteNotFoundElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts index fc2663470f..387eb72b4e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts @@ -9,3 +9,4 @@ export * from './path-pattern.class.js'; export * from './modal-registration/modal-route-registration.interface.js'; export * from './modal-registration/modal-route-registration.controller.js'; export * from './types.js'; +export * from './components/not-found/route-not-found.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts index 43640abca6..be6e3ac0f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts @@ -74,7 +74,7 @@ export class UmbWorkspaceEditorElement extends UmbLitElement { newRoutes.push({ path: `**`, - component: () => import('../workspace-views/workspace-fallback-view.element.js'), + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, }); this._routes = newRoutes; From 8d531f950a86bd5796b2352170d2fe1fe1c5b733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:02:31 +0200 Subject: [PATCH 03/23] main no route --- .../components/backoffice-main.element.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts index b4584ee573..a13afc7364 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts @@ -2,7 +2,7 @@ import type { UmbBackofficeContext } from '../backoffice.context.js'; import { UMB_BACKOFFICE_CONTEXT } from '../backoffice.context.js'; import { css, html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbSectionContext, UMB_SECTION_CONTEXT, UMB_SECTION_PATH_PATTERN } from '@umbraco-cms/backoffice/section'; -import type { UmbRoute, UmbRouterSlotChangeEvent } from '@umbraco-cms/backoffice/router'; +import type { PageComponent, UmbRoute, UmbRouterSlotChangeEvent } from '@umbraco-cms/backoffice/router'; import type { ManifestSection, UmbSectionElement } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbExtensionManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; @@ -11,7 +11,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-backoffice-main') export class UmbBackofficeMainElement extends UmbLitElement { @state() - private _routes: Array = []; + private _routes: Array = []; @state() private _sections: Array> = []; @@ -43,28 +43,33 @@ export class UmbBackofficeMainElement extends UmbLitElement { private _createRoutes() { if (!this._sections) return; - const oldValue = this._routes; // TODO: Refactor this for re-use across the app where the routes are re-generated at any time. - this._routes = this._sections + const newRoutes = this._sections .filter((x) => x.manifest) .map((section) => { - const existingRoute = this._routes.find((r) => r.alias === section.alias); + const existingRoute = this._routes.find((r) => r.path === UMB_SECTION_PATH_PATTERN.generateLocal({ sectionName: section.manifest!.meta.pathname })); if (existingRoute) { return existingRoute; } else { return { - alias: section.alias, + //alias: section.alias, path: UMB_SECTION_PATH_PATTERN.generateLocal({ sectionName: section.manifest!.meta.pathname }), component: () => createExtensionElement(section.manifest!, 'umb-section-default'), - setup: (component) => { - (component as UmbSectionElement).manifest = section.manifest as ManifestSection; + setup: (component: PageComponent) => { + (component as UmbSectionElement).manifest = section.manifest; }, }; } }); - this.requestUpdate('_routes', oldValue); + + newRoutes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); + + this._routes = newRoutes; } private _onRouteChange = async (event: UmbRouterSlotChangeEvent) => { From e3c1e2ed571a3b45d8bf55d0df53619b473afce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:03:35 +0200 Subject: [PATCH 04/23] fix test issue --- .../src/libs/context-api/consume/context-consumer.test.ts | 2 +- .../property-dataset/property-dataset.element.test.ts | 4 ++-- .../core/utils/pagination-manager/pagination.manager.test.ts | 2 +- 3 files changed, 4 insertions(+), 4 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 9baf9ea886..bd14391528 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 @@ -39,7 +39,7 @@ describe('UmbContextConsumer', () => { describe('events', () => { it('dispatches context request event when constructed', async () => { - const listener = oneEvent(window, UMB_CONTENT_REQUEST_EVENT_TYPE, false); + const listener = oneEvent(window, UMB_CONTENT_REQUEST_EVENT_TYPE); consumer.hostConnected(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-dataset/property-dataset.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-dataset/property-dataset.element.test.ts index 09338ec71c..363788c23d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-dataset/property-dataset.element.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-dataset/property-dataset.element.test.ts @@ -133,7 +133,7 @@ describe('UmbBasicVariantElement', () => { }); it('fires change event', async () => { - const listener = oneEvent(datasetElement, UmbChangeEvent.TYPE, false); + const listener = oneEvent(datasetElement, UmbChangeEvent.TYPE); expect(propertyEditor.alias).to.eq('testAlias'); propertyEditor.setValue('testValue3'); @@ -153,7 +153,7 @@ describe('UmbBasicVariantElement', () => { adapterPropertyEditor.alias = 'testAdapterAlias'; datasetElement.appendChild(adapterPropertyEditor); - const listener = oneEvent(datasetElement, UmbChangeEvent.TYPE, false); + const listener = oneEvent(datasetElement, UmbChangeEvent.TYPE); // The alias of the original property editor must be 'testAlias' for the adapter to set the value of it. expect(propertyEditor.alias).to.eq('testAlias'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.test.ts index 3d2fe4f7a2..b18c0c2d30 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.test.ts @@ -141,7 +141,7 @@ describe('UmbPaginationManager', () => { }); it('dispatches a change event', async () => { - const listener = oneEvent(manager, UmbChangeEvent.TYPE, false); + const listener = oneEvent(manager, UmbChangeEvent.TYPE); manager.setCurrentPageNumber(2); const event = (await listener) as unknown as UmbChangeEvent; const target = event.target as UmbPaginationManager; From 3dba4abb32eeb85a478ad390f676698e05294e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:05:53 +0200 Subject: [PATCH 05/23] add default routes --- .../workspace/views/edit/block-workspace-view-edit.element.ts | 4 ++++ .../components/workspace-editor/workspace-editor.element.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit.element.ts index 9a724cccf8..be1bb476eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit.element.ts @@ -116,6 +116,10 @@ export class UmbBlockWorkspaceViewEditElement extends UmbLitElement implements U path: '', redirectTo: routes[0]?.path, }); + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); } this._routes = routes; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts index be6e3ac0f2..0de9a8d5f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts @@ -72,6 +72,10 @@ export class UmbWorkspaceEditorElement extends UmbLitElement { }); } + newRoutes.push({ + path: '', + redirectTo: newRoutes[0]?.path, + }); newRoutes.push({ path: `**`, component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, From cb1f5e1249d936e4abf145c6b499bcfc8e7caad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:11:14 +0200 Subject: [PATCH 06/23] only navigate when a change has been detected --- .../src/external/router-slot/router-slot.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts b/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts index 4bf3e5d5e5..85ca8d15d8 100644 --- a/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts +++ b/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts @@ -201,11 +201,8 @@ export class RouterSlot extends HTMLElement implements IRouter navigate = this._routeMatch === null; if (navigate === false) { const newMatch = this.getRouteMatch(); - console.log("new match...", newMatch) - // Check if match is still present? [NL] - // Check if there is a better/different match? [NL] - // Maybe both are handled in this approach? [NL] - navigate = this._routeMatch !== newMatch; + // Check if this match matches the current match (aka. If the path has changed), if so we should navigate. [NL] + navigate = this._routeMatch?.route.path !== newMatch?.route.path; } } @@ -214,7 +211,6 @@ export class RouterSlot extends HTMLElement implements IRouter // Register that the path has changed so the correct route can be loaded. if (navigate) { - console.log("navigate...") this.render(); } } From 9d76cce610ca5e6c6b6ed3e975264069beb2dfd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:11:22 +0200 Subject: [PATCH 07/23] default routes --- .../backoffice/components/backoffice-main.element.ts | 6 ++++++ .../workspace-editor/workspace-editor.element.ts | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts index a13afc7364..7b03cfe3d7 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts @@ -63,6 +63,12 @@ export class UmbBackofficeMainElement extends UmbLitElement { } }); + if(newRoutes.length > 0 ) { + newRoutes.push({ + path: ``, + redirectTo: newRoutes[0].path + }); + } newRoutes.push({ path: `**`, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts index 0de9a8d5f7..ccac1676b7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts @@ -70,12 +70,14 @@ export class UmbWorkspaceEditorElement extends UmbLitElement { }, } as UmbRoute; }); + + newRoutes.push({ + path: '', + redirectTo: newRoutes[0]?.path, + }); + } - newRoutes.push({ - path: '', - redirectTo: newRoutes[0]?.path, - }); newRoutes.push({ path: `**`, component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, From 93ffebd22196f6149cefa19f9cc62ae578c6e3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:28:09 +0200 Subject: [PATCH 08/23] remove editable workspace kind --- .../editable/editable-workspace.element.ts | 38 ------------------- .../kinds/editable/editable-workspace.kind.ts | 13 ------- .../kinds/editable/editable-workspace.test.ts | 22 ----------- .../workspace/data-type-workspace.context.ts | 8 ++-- .../packages/data-type/workspace/manifests.ts | 2 +- 5 files changed, 4 insertions(+), 79 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.kind.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts deleted file mode 100644 index 66b74b929d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.element.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { UmbSubmittableWorkspaceContext } from '../../contexts/tokens/submittable-workspace-context.interface.js'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { html, customElement, state, css } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbRoute } from '@umbraco-cms/backoffice/router'; -import { UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; - -@customElement('umb-editable-workspace') -export class UmbEditableWorkspaceElement extends UmbLitElement { - @state() - _routes: UmbRoute[] = []; - - public set api(api: UmbSubmittableWorkspaceContext) { - this.observe(api.routes.routes, (routes) => (this._routes = routes)); - - new UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'workspaceContext', [api]); - } - - override render() { - return html` `; - } - - static override styles = [ - css` - form { - display: contents; - } - `, - ]; -} - -export default UmbEditableWorkspaceElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-editable-workspace': UmbEditableWorkspaceElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.kind.ts deleted file mode 100644 index 81ddb39fda..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.kind.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; - -export const manifest: UmbBackofficeManifestKind = { - type: 'kind', - alias: 'Umb.Kind.Workspace.Editable', - matchKind: 'editable', - matchType: 'workspace', - manifest: { - type: 'workspace', - kind: 'editable', - element: () => import('./editable-workspace.element.js'), - }, -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts deleted file mode 100644 index e0f2d541ca..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/editable/editable-workspace.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { UmbEditableWorkspaceElement } from './editable-workspace.element.js'; -import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -describe('UmbEditableWorkspaceElement', () => { - let element: UmbEditableWorkspaceElement; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbEditableWorkspaceElement); - }); - - if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { - it('passes the a11y audit', async () => { - // TODO: should we use shadowDom here? - await expect(element).to.be.accessible(defaultA11yConfig); - }); - } -}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts index 683007dc0b..b225a924a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/data-type-workspace.context.ts @@ -1,6 +1,3 @@ -import { UmbDataTypeDetailRepository } from '../repository/detail/data-type-detail.repository.js'; -import type { UmbDataTypeDetailModel, UmbDataTypePropertyModel } from '../types.js'; -import { UmbDataTypeWorkspaceEditorElement } from './data-type-workspace-editor.element.js'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import type { UmbInvariantDatasetWorkspaceContext, @@ -10,7 +7,6 @@ import { UmbSubmittableWorkspaceContextBase, UmbInvariantWorkspacePropertyDatasetContext, UmbWorkspaceIsNewRedirectController, - UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; import { appendToFrozenArray, @@ -29,7 +25,9 @@ import { UmbRequestReloadChildrenOfEntityEvent, UmbRequestReloadStructureForEntityEvent, } from '@umbraco-cms/backoffice/entity-action'; -import { UMB_PROPERTY_EDITOR_SCHEMA_ALIAS_DEFAULT } from '@umbraco-cms/backoffice/property-editor'; +import type { UmbDataTypeDetailModel, UmbDataTypePropertyModel } from '../types.js'; +import { UmbDataTypeDetailRepository } from '../repository/detail/data-type-detail.repository.js'; +import { UmbDataTypeWorkspaceEditorElement } from './data-type-workspace-editor.element.js'; type EntityType = UmbDataTypeDetailModel; export class UmbDataTypeWorkspaceContext diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts index d8887e858d..62232d9507 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts @@ -10,7 +10,7 @@ const DATA_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.DataType'; const workspace: ManifestWorkspaces = { type: 'workspace', - kind: 'editable', + kind: 'routable', alias: DATA_TYPE_WORKSPACE_ALIAS, name: 'Data Type Workspace', api: () => import('./data-type-workspace.context.js'), From 608de15e738a24d4ab5c70f55ddbaf8e2d6ba3f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:28:38 +0200 Subject: [PATCH 09/23] simplify section route implementation --- .../packages/core/section/section-default.element.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts index 7a842e0cc1..ded72f1ac6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts @@ -13,12 +13,12 @@ import type { IRoute, IRoutingInfo, PageComponent, UmbRoute } from '@umbraco-cms import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbExtensionElementInitializer } from '@umbraco-cms/backoffice/extension-api'; import { - UmbExtensionsApiInitializer, UmbExtensionsElementInitializer, UmbExtensionsManifestInitializer, createExtensionApi, + createExtensionElement, } from '@umbraco-cms/backoffice/extension-api'; -import { aliasToPath, debounce } from '@umbraco-cms/backoffice/utils'; +import { aliasToPath } from '@umbraco-cms/backoffice/utils'; /** * @export @@ -90,11 +90,10 @@ export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectio api?.getPath?.() || extensionController.manifest.meta?.path || aliasToPath(extensionController.manifest.alias), - // TODO: look into removing the "as PageComponent" type hack // be aware that this is kind of a hack to pass the manifest element to the router. But as the two resolve components // in a similar way. I currently find it more safe to let the router do the component resolving instead // of replicating it as a custom resolver here. - component: extensionController.manifest.element as PageComponent | PromiseLike, + component: () => createExtensionElement(extensionController.manifest), setup: (element: PageComponent, info: IRoutingInfo) => { api?.setup?.(element, info); }, @@ -102,13 +101,14 @@ export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectio }), ); - this.#debouncedCreateRoutes(routes); + //this.#debouncedCreateRoutes(routes); + this.#createRoutes(routes); }, 'umbRouteExtensionApisInitializer', ); } - #debouncedCreateRoutes = debounce(this.#createRoutes, 50); + //#debouncedCreateRoutes = debounce(this.#createRoutes, 50); #createRoutes(routes: Array) { this._routes = [ From 0244a3223898dc07c7451d8ccf8e01eb6703d397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:28:48 +0200 Subject: [PATCH 10/23] remove kind declaration --- .../src/packages/core/workspace/kinds/manifests.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/manifests.ts index f36f36118d..380b26b726 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/kinds/manifests.ts @@ -1,5 +1,4 @@ -import { manifest as editableKindManifest } from './editable/editable-workspace.kind.js'; import { manifest as routableKindManifest } from './routable/routable-workspace.kind.js'; import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; -export const manifests: Array = [routableKindManifest, editableKindManifest]; +export const manifests: Array = [routableKindManifest]; From b2fd6b7388cf457c50bc1ad1d43ff852ab25fd00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:29:01 +0200 Subject: [PATCH 11/23] no route routes --- .../packages/core/collection/collection-view.manager.ts | 5 +++++ .../views/design/content-type-design-editor.element.ts | 5 +++++ .../workspace/views/edit/content-editor.element.ts | 9 ++++----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.ts index 7fc6f58e72..7d380142c3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.ts @@ -98,6 +98,11 @@ export class UmbCollectionViewManager extends UmbControllerBase { }); } + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); + this.#routes.setValue(routes); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts index 5870d71547..b109a12770 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/content-type-design-editor.element.ts @@ -226,6 +226,11 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements } } + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); + this._routes = routes; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor.element.ts index d13e1ac804..12d1743e26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor.element.ts @@ -108,11 +108,10 @@ export class UmbContentWorkspaceViewEditElement extends UmbLitElement implements }); } - // Find the routes who are removed: - //const removedRoutes = this._routes.filter((route) => !routes.find((r) => r.path === route.path)); - - // Find the routes who are new: - //const newRoutes = routes.filter((route) => !this._routes.find((r) => r.path === route.path)); + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); this._routes = routes; } From c7615be9f96b76a221c23cb0a353a50014b99e37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 10:39:39 +0200 Subject: [PATCH 12/23] implement not found routes --- .../block-grid-area-type-workspace.context.ts | 2 +- .../block-type-workspace-editor.element.ts | 2 +- .../workspace/block-type-workspace.context.ts | 6 ++--- .../workspace-route-manager.controller.ts | 10 +++++++- .../workspace/dictionary-workspace.context.ts | 7 +++--- ...ment-blueprint-workspace-editor.element.ts | 13 +++++++---- .../document-type-workspace.context.ts | 23 +++++++++---------- .../document-workspace-editor.element.ts | 7 +++++- .../dashboard-health-check.element.ts | 5 +++- .../language/language-workspace.context.ts | 1 - .../workspace/media-type-workspace.context.ts | 1 - .../media-section-view.element.ts | 4 ++++ .../media-workspace-editor.element.ts | 5 ++++ .../member-group-section-view.element.ts | 4 ++++ .../member-group-workspace.context.ts | 1 - .../member-type-workspace.context.ts | 1 - .../member-section-view.element.ts | 4 ++++ .../member-workspace-editor.element.ts | 5 ++++ .../created-packages-section-view.element.ts | 4 ++++ .../dashboard-examine-management.element.ts | 5 +++- .../partial-view-workspace.context.ts | 1 - .../partial-view-workspace.element.ts | 4 ++++ .../workspace/script-workspace.context.ts | 1 - .../workspace/stylesheet-workspace.context.ts | 1 - .../workspace/template-workspace.context.ts | 1 - .../user-group-section-view.element.ts | 4 ++++ .../workspace/user-group-workspace.context.ts | 1 - .../users-section-view.element.ts | 4 ++++ 28 files changed, 89 insertions(+), 38 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts index d9ee93951c..56f5cd7a32 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/block-grid-area-type-workspace.context.ts @@ -1,4 +1,3 @@ -import type { UmbBlockGridTypeAreaType } from '../../../types.js'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { @@ -14,6 +13,7 @@ import { UmbArrayState, UmbObjectState, appendToFrozenArray } from '@umbraco-cms import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { ManifestWorkspace, PropertyEditorSettingsProperty } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbBlockGridTypeAreaType } from '../../../types.js'; export class UmbBlockGridAreaTypeWorkspaceContext extends UmbSubmittableWorkspaceContextBase diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace-editor.element.ts index 18a5dacd63..4f08b1c709 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace-editor.element.ts @@ -1,10 +1,10 @@ -import { UMB_BLOCK_TYPE_WORKSPACE_CONTEXT } from './block-type-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { customElement, css, html, state, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbRepositoryItemsManager } from '@umbraco-cms/backoffice/repository'; import type { UmbDocumentTypeItemModel } from '@umbraco-cms/backoffice/document-type'; import { UMB_DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS } from '@umbraco-cms/backoffice/document-type'; +import { UMB_BLOCK_TYPE_WORKSPACE_CONTEXT } from './block-type-workspace.context-token.js'; @customElement('umb-block-type-workspace-editor') export class UmbBlockTypeWorkspaceEditorElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts index 667af0cdd1..095d892c25 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts @@ -1,5 +1,3 @@ -import type { UmbBlockTypeBaseModel, UmbBlockTypeWithGroupKey } from '../types.js'; -import { UmbBlockTypeWorkspaceEditorElement } from './block-type-workspace-editor.element.js'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { @@ -14,6 +12,8 @@ import { import { UmbArrayState, UmbObjectState, appendToFrozenArray } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { ManifestWorkspace, PropertyEditorSettingsProperty } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbBlockTypeBaseModel, UmbBlockTypeWithGroupKey } from '../types.js'; +import { UmbBlockTypeWorkspaceEditorElement } from './block-type-workspace-editor.element.js'; export class UmbBlockTypeWorkspaceContext extends UmbSubmittableWorkspaceContextBase @@ -27,7 +27,7 @@ export class UmbBlockTypeWorkspaceContext 'block'); + readonly name = this.#data.asObservablePart(() => 'block'); readonly unique = this.#data.asObservablePart((data) => data?.contentElementTypeKey); #properties = new UmbArrayState([], (x) => x.alias); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-route-manager.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-route-manager.controller.ts index 6fedc8a00e..6e2943c12b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-route-manager.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-route-manager.controller.ts @@ -8,6 +8,14 @@ export class UmbWorkspaceRouteManager extends UmbControllerBase { public readonly routes = this.#routes.asObservable(); setRoutes(routes: Array) { - this.#routes.setValue(routes); + this.#routes.setValue( + [ + ...routes, + { + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } + ] + ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts index 574735c961..515ef22ebf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts @@ -1,10 +1,6 @@ -import { UmbDictionaryDetailRepository } from '../repository/index.js'; -import type { UmbDictionaryDetailModel } from '../types.js'; -import { UmbDictionaryWorkspaceEditorElement } from './dictionary-workspace-editor.element.js'; import { type UmbSubmittableWorkspaceContext, UmbSubmittableWorkspaceContextBase, - UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, type UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; @@ -15,6 +11,9 @@ import { UmbRequestReloadChildrenOfEntityEvent, UmbRequestReloadStructureForEntityEvent, } from '@umbraco-cms/backoffice/entity-action'; +import type { UmbDictionaryDetailModel } from '../types.js'; +import { UmbDictionaryDetailRepository } from '../repository/index.js'; +import { UmbDictionaryWorkspaceEditorElement } from './dictionary-workspace-editor.element.js'; export class UmbDictionaryWorkspaceContext extends UmbSubmittableWorkspaceContextBase diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts index d0cf8ed639..6e89f5b110 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts @@ -1,10 +1,10 @@ -import type { UmbDocumentBlueprintVariantOptionModel } from '../types.js'; -import { UmbDocumentBlueprintWorkspaceSplitViewElement } from './document-blueprint-workspace-split-view.element.js'; -import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from './document-blueprint-workspace.context-token.js'; import { customElement, state, css, html } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; +import type { UmbDocumentBlueprintVariantOptionModel } from '../types.js'; +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from './document-blueprint-workspace.context-token.js'; +import { UmbDocumentBlueprintWorkspaceSplitViewElement } from './document-blueprint-workspace-split-view.element.js'; @customElement('umb-document-blueprint-workspace-editor') export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { @@ -83,6 +83,11 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { }); } + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); + const oldValue = this._routes; // is there any differences in the amount ot the paths? [NL] @@ -101,7 +106,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { }; override render() { - return this._routes && this._routes.length > 0 + return this._routes ? html`` : ''; } 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 723a64861e..db60bae4ef 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,14 +1,3 @@ -import { UmbDocumentTypeDetailRepository } from '../repository/detail/document-type-detail.repository.js'; -import { UMB_DOCUMENT_TYPE_ENTITY_TYPE } from '../entity.js'; -import type { UmbDocumentTypeDetailModel } from '../types.js'; -import { - UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, - UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_ELEMENT, - UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_TEMPLATE, - UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, - type UmbCreateDocumentTypeWorkspacePresetType, -} from '../paths.js'; -import { UmbDocumentTypeWorkspaceEditorElement } from './document-type-workspace-editor.element.js'; import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { @@ -18,7 +7,6 @@ import { import { UmbSubmittableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, - UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; import { UmbTemplateDetailRepository } from '@umbraco-cms/backoffice/template'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; @@ -31,6 +19,17 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import type { UmbRoutableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { UmbPathPatternTypeAsEncodedParamsType } from '@umbraco-cms/backoffice/router'; +import { + UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, + UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_ELEMENT, + UMB_CREATE_DOCUMENT_TYPE_WORKSPACE_PRESET_TEMPLATE, + UMB_EDIT_DOCUMENT_TYPE_WORKSPACE_PATH_PATTERN, + type UmbCreateDocumentTypeWorkspacePresetType, +} from '../paths.js'; +import type { UmbDocumentTypeDetailModel } from '../types.js'; +import { UMB_DOCUMENT_TYPE_ENTITY_TYPE } from '../entity.js'; +import { UmbDocumentTypeDetailRepository } from '../repository/detail/document-type-detail.repository.js'; +import { UmbDocumentTypeWorkspaceEditorElement } from './document-type-workspace-editor.element.js'; type EntityType = UmbDocumentTypeDetailModel; export class UmbDocumentTypeWorkspaceContext 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 5252f6f369..f024c5a0d0 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 @@ -110,6 +110,11 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { }); } + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); + const oldValue = this._routes; // is there any differences in the amount ot the paths? [NL] @@ -128,7 +133,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { }; override render() { - return this._routes && this._routes.length > 0 + return this._routes ? html`` : ''; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts index 8ddaf1166a..89e68e26fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts @@ -24,7 +24,10 @@ export class UmbDashboardHealthCheckElement extends UmbLitElement { { path: ``, component: () => import('./views/health-check-overview.element.js'), - }, + },{ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } ]; private _healthCheckDashboardContext = new UmbHealthCheckDashboardContext(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts index 66507f1ee0..abf77a8fda 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/language-workspace.context.ts @@ -1,7 +1,6 @@ import { type UmbSubmittableWorkspaceContext, UmbSubmittableWorkspaceContextBase, - UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, type UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; 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 cc72c0ac24..e5c23009f2 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 @@ -6,7 +6,6 @@ import { UmbSubmittableWorkspaceContextBase, type UmbRoutableWorkspaceContext, UmbWorkspaceIsNewRedirectController, - UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/section-view/media-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/section-view/media-section-view.element.ts index a3c5c4d2ea..c747046a92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/section-view/media-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/section-view/media-section-view.element.ts @@ -52,6 +52,10 @@ export class UmbMediaSectionViewElement extends UmbLitElement { path: '', redirectTo: 'collection', }, + { + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } ]; }, '_observeConfigDataType', 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 2912be0036..d72c85f8bd 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 @@ -83,6 +83,11 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { }); } + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); + const oldValue = this._routes; // is there any differences in the amount ot the paths? [NL] diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/section-view/member-group-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/section-view/member-group-section-view.element.ts index c8f50f65dd..6c26efc387 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/section-view/member-group-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/section-view/member-group-section-view.element.ts @@ -28,6 +28,10 @@ export class UmbMemberGroupSectionViewElement extends UmbLitElement { path: '', redirectTo: 'collection', }, + { + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } ]; override render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts index 16d3dcbf0b..1258127044 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/member-group-workspace.context.ts @@ -5,7 +5,6 @@ import { UmbMemberGroupWorkspaceEditorElement } from './member-group-workspace-e import { type UmbSubmittableWorkspaceContext, UmbSubmittableWorkspaceContextBase, - UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, type UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts index 7aa6614fdb..e791fc1e19 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts @@ -5,7 +5,6 @@ import { UmbMemberTypeWorkspaceEditorElement } from './member-type-workspace-edi import { UmbSubmittableWorkspaceContextBase, type UmbRoutableWorkspaceContext, - UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/section-view/member-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/section-view/member-section-view.element.ts index a5fc58ae48..a8e39e82ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/section-view/member-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/section-view/member-section-view.element.ts @@ -28,6 +28,10 @@ export class UmbMemberSectionViewElement extends UmbLitElement { path: '', redirectTo: 'collection', }, + { + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } ]; override render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts index b44cf47bd6..e9e83446c7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts @@ -85,6 +85,11 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { }); } + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); + const oldValue = this._routes; // is there any differences in the amount ot the paths? [NL] diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/created/created-packages-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/created/created-packages-section-view.element.ts index f0f862cf48..d19f3286d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/created/created-packages-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/created/created-packages-section-view.element.ts @@ -61,6 +61,10 @@ export class UmbCreatedPackagesSectionViewElement extends UmbLitElement implemen path: '', redirectTo: 'overview', }); + routes.push({ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + }); this._routes = routes; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/dashboard-examine-management.element.ts b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/dashboard-examine-management.element.ts index 889d33f035..e3c25b4819 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/dashboard-examine-management.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/dashboard-examine-management.element.ts @@ -28,7 +28,10 @@ export class UmbDashboardExamineManagementElement extends UmbLitElement { { path: ``, component: () => import('./views/section-view-examine-overview.js'), - }, + },{ + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } ]; @state() 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 700c62c35d..598e91175a 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 @@ -8,7 +8,6 @@ import type { UmbRoutableWorkspaceContext, UmbSubmittableWorkspaceContext } from import { UmbSubmittableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, - UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.element.ts index 2bf5171364..ee0161c6f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.element.ts @@ -44,6 +44,10 @@ export class UmbPartialViewWorkspaceElement extends UmbLitElement { this.#workspaceContext.load(unique); }, }, + { + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } ]; constructor() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts index 42e23b26ba..b037442377 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts @@ -10,7 +10,6 @@ import { type UmbRoutableWorkspaceContext, type UmbSubmittableWorkspaceContext, UmbWorkspaceIsNewRedirectController, - UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; 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 e624f48c77..ad403df9b0 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 @@ -6,7 +6,6 @@ import { UmbStylesheetWorkspaceEditorElement } from './stylesheet-workspace-edit import { type UmbSubmittableWorkspaceContext, UmbSubmittableWorkspaceContextBase, - UmbWorkspaceRouteManager, UmbWorkspaceIsNewRedirectController, type UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; 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 3bb13d3814..ea4f07ffab 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 @@ -8,7 +8,6 @@ import type { UmbRoutableWorkspaceContext, UmbSubmittableWorkspaceContext } from import { UmbSubmittableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, - UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; import { UmbBooleanState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/section-view/user-group-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/section-view/user-group-section-view.element.ts index 87ac0b018d..53a170f589 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/section-view/user-group-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/section-view/user-group-section-view.element.ts @@ -30,6 +30,10 @@ export class UmbUserGroupSectionViewElement extends UmbLitElement { path: '', redirectTo: 'collection', }, + { + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } ]; override render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index 482457629f..0ad5583347 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -6,7 +6,6 @@ import type { UmbRoutableWorkspaceContext, UmbSubmittableWorkspaceContext } from import { UmbSubmittableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, - UmbWorkspaceRouteManager, } from '@umbraco-cms/backoffice/workspace'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/section-view/users-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/section-view/users-section-view.element.ts index 4869ea58b8..cd89bfe71d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/section-view/users-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/section-view/users-section-view.element.ts @@ -34,6 +34,10 @@ export class UmbSectionViewUsersElement extends UmbLitElement { path: '', redirectTo: 'collection', }, + { + path: `**`, + component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, + } ]; override render() { From 15f29f3427583d3b8d2ca69c602032d7f1a5fb3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 11:02:47 +0200 Subject: [PATCH 13/23] import order --- .../condition/document-user-permission.condition.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/condition/document-user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/condition/document-user-permission.condition.ts index da991c449d..8a2721981b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/condition/document-user-permission.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/condition/document-user-permission.condition.ts @@ -1,4 +1,3 @@ -import { isDocumentUserPermission } from '../utils.js'; import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; @@ -10,6 +9,7 @@ import type { } from '@umbraco-cms/backoffice/extension-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { DocumentPermissionPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { isDocumentUserPermission } from '../utils.js'; export class UmbDocumentUserPermissionCondition extends UmbConditionBase From 485c136874889916ad10efd19f3a588989d41ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 11:13:20 +0200 Subject: [PATCH 14/23] comment --- .../controller/base-extension-initializer.controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts index 07443ad840..84abaf321c 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts @@ -211,6 +211,8 @@ export abstract class UmbBaseExtensionInitializer< // Check if we already have a controller for this config: const existing = this.#conditionControllers.find((controller) => controller.config === conditionConfig); if (!existing) { + + // TODO: Be aware that we might not have a host element any longer at this moment, but I did not want to make a fix for it jet, as its a good indication to if something else is terrible wrong [NL] const conditionController = await createExtensionApi(this, conditionManifest, [ { manifest: conditionManifest, From 6d3a9007b3059f2766c58f3af8219bd842787972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 11:13:41 +0200 Subject: [PATCH 15/23] import sorting --- .../workspace/document-workspace-editor.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 f024c5a0d0..2179acf81d 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 type { UmbDocumentVariantOptionModel } from '../types.js'; -import { UmbDocumentWorkspaceSplitViewElement } from './document-workspace-split-view.element.js'; -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from './document-workspace.context-token.js'; import { customElement, state, css, html } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; import { UMB_APP_LANGUAGE_CONTEXT } from '@umbraco-cms/backoffice/language'; +import type { UmbDocumentVariantOptionModel } from '../types.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from './document-workspace.context-token.js'; +import { UmbDocumentWorkspaceSplitViewElement } from './document-workspace-split-view.element.js'; // TODO: This seem fully identical with Media Workspace Editor, so we can refactor this to a generic component. [NL] @customElement('umb-document-workspace-editor') From ee70119b1cbf6b356738121c103ae0a84186bc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 12:13:20 +0200 Subject: [PATCH 16/23] re-initialize workspace split view when switching variant --- .../src/libs/observable-api/observer.ts | 5 +++-- .../edit/content-editor-properties.element.ts | 1 + .../workspace-editor.element.ts | 2 ++ ...pace-split-view-variant-selector.element.ts | 12 ++++++------ .../workspace-split-view.element.ts | 5 ++++- .../workspace-split-view-manager.controller.ts | 9 +++++---- ...ument-blueprint-workspace-editor.element.ts | 7 ++----- .../document-workspace-editor.element.ts | 18 +++++++++--------- .../document-workspace-split-view.element.ts | 16 ++++++++++++++++ .../media-workspace-editor.element.ts | 7 ++----- .../member-workspace-editor.element.ts | 7 ++----- 11 files changed, 52 insertions(+), 37 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts index 8f32bf88d9..d41d1aaae0 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts @@ -5,12 +5,13 @@ export type ObserverCallback = (value: T) => void; export class UmbObserver { #source!: Observable; - #callback!: ObserverCallback; + #callback?: ObserverCallback; #subscription!: Subscription; constructor(source: Observable, callback?: ObserverCallback) { this.#source = source; if (callback) { + this.#callback = callback; this.#subscription = source.subscribe(callback); } } @@ -44,7 +45,7 @@ export class UmbObserver { hostConnected() { // Notice: This will not re-subscribe if this controller was destroyed. Only if the subscription was closed. - if (this.#subscription?.closed) { + if (this.#subscription?.closed && this.#callback) { this.#subscription = this.#source.subscribe(this.#callback); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor-properties.element.ts index 18173790f5..aa03023a26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor-properties.element.ts @@ -41,6 +41,7 @@ export class UmbContentWorkspaceViewEditPropertiesElement extends UmbLitElement ); }); this.consumeContext(UMB_PROPERTY_DATASET_CONTEXT, (datasetContext) => { + console.log(this, datasetContext) this.#variantId = datasetContext.getVariantId(); this.#generatePropertyDataPath(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts index cd43be73f3..a376d72b0a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts @@ -49,6 +49,8 @@ export class UmbWorkspaceEditorElement extends UmbLitElement { constructor() { super(); + console.log("workspace editor created.") + new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'workspaceView', null, (workspaceViews) => { this._workspaceViews = workspaceViews.map((view) => view.manifest); this._createRoutes(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts index 96097c23a8..2c2d951f6b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts @@ -1,17 +1,17 @@ -import type { ActiveVariant } from '../../controllers/index.js'; -import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT } from './workspace-split-view.context.js'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { UMB_PROPERTY_DATASET_CONTEXT, isNameablePropertyDatasetContext } from '@umbraco-cms/backoffice/property'; import { type UUIInputElement, UUIInputEvent, type UUIPopoverContainerElement, } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state, query } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbDocumentWorkspaceContext } from '@umbraco-cms/backoffice/document'; +import type { ActiveVariant } from '../../controllers/index.js'; +import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT } from './workspace-split-view.context.js'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UMB_PROPERTY_DATASET_CONTEXT, isNameablePropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; type UmbDocumentVariantOption = { culture: string | null; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.element.ts index 78ae74b82b..75b4ea0180 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.element.ts @@ -1,6 +1,6 @@ +import { css, html, customElement, property, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbWorkspaceSplitViewContext } from './workspace-split-view.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, html, customElement, property, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; // import local components @@ -34,6 +34,9 @@ export class UmbWorkspaceSplitViewElement extends UmbLitElement { splitViewContext = new UmbWorkspaceSplitViewContext(this); override render() { + + console.log("workspace split view render") + return html` ([], (x) => x.index); + #activeVariantsInfo = new UmbArrayState([], (x) => x.index).sortBy((a, b) => (a.index || 0) - (b.index || 0)); public readonly activeVariantsInfo = this.#activeVariantsInfo.asObservable(); private _routeBase?: string; @@ -25,7 +25,8 @@ export class UmbWorkspaceSplitViewManager { } setActiveVariant(index: number, culture: string | null, segment: string | null) { - this.#activeVariantsInfo.appendOne({ index, culture: culture || null, segment: segment || null }); + console.log("setActiveVariant", index, culture, segment) + this.#activeVariantsInfo.appendOneAt({ index, culture: culture ?? null, segment: segment ?? null }, index); } getActiveVariants() { @@ -39,7 +40,7 @@ export class UmbWorkspaceSplitViewManager { } public activeVariantByIndex(index: number) { - return this.#activeVariantsInfo.asObservablePart((data) => data[index] || undefined); + return this.#activeVariantsInfo.asObservablePart((data) => data.find(x => x.index === index) || undefined); } public switchVariant(index: number, variantId: UmbVariantId) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts index d0cf8ed639..64e12e51af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts @@ -8,9 +8,6 @@ import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/r @customElement('umb-document-blueprint-workspace-editor') export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { - // - // 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. [NL] - private splitViewElement = new UmbDocumentBlueprintWorkspaceSplitViewElement(); #workspaceContext?: typeof UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT.TYPE; @@ -49,7 +46,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variantA.unique + '_&_' + variantB.unique, - component: this.splitViewElement, + component: UmbDocumentBlueprintWorkspaceSplitViewElement, setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); @@ -66,7 +63,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variant.unique, - component: this.splitViewElement, + component: UmbDocumentBlueprintWorkspaceSplitViewElement, setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); 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 5252f6f369..0d804d6c18 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,18 +1,18 @@ -import type { UmbDocumentVariantOptionModel } from '../types.js'; -import { UmbDocumentWorkspaceSplitViewElement } from './document-workspace-split-view.element.js'; -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from './document-workspace.context-token.js'; import { customElement, state, css, html } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; import { UMB_APP_LANGUAGE_CONTEXT } from '@umbraco-cms/backoffice/language'; +import type { UmbDocumentVariantOptionModel } from '../types.js'; +import { UmbDocumentWorkspaceSplitViewElement } from './document-workspace-split-view.element.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from './document-workspace.context-token.js'; // TODO: This seem fully identical with Media Workspace Editor, so we can refactor this to a generic component. [NL] @customElement('umb-document-workspace-editor') export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { // // 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. [NL] - private splitViewElement = new UmbDocumentWorkspaceSplitViewElement(); + //private splitViewElement = new UmbDocumentWorkspaceSplitViewElement(); #appLanguage?: typeof UMB_APP_LANGUAGE_CONTEXT.TYPE; #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; @@ -67,7 +67,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique still is URL Safe, cause its most likely not... [NL] path: variantA.unique + '_&_' + variantB.unique, - component: this.splitViewElement, + component: UmbDocumentWorkspaceSplitViewElement, setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); @@ -84,7 +84,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique still is URL Safe, cause its most likely not... [NL] path: variant.unique, - component: this.splitViewElement, + component: UmbDocumentWorkspaceSplitViewElement, setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); @@ -110,16 +110,16 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { }); } - const oldValue = this._routes; + /*const oldValue = this._routes; // is there any differences in the amount ot the paths? [NL] if (oldValue && oldValue.length === routes.length) { // is there any differences in the paths? [NL] const hasDifferences = oldValue.some((route, index) => route.path !== routes[index].path); if (!hasDifferences) return; - } + }*/ this._routes = routes; - this.requestUpdate('_routes', oldValue); + //this.requestUpdate('_routes', oldValue); } private _gotWorkspaceRoute = (e: UmbRouterSlotInitEvent) => { 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 97f56208fa..50fbbb01a4 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 @@ -28,11 +28,27 @@ export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { this._workspaceContext.splitView.activeVariantsInfo, (variants) => { this._variants = variants; + console.log("______variants: ", variants[0]) }, '_observeActiveVariantsInfo', ); } + override connectedCallback(): void { + super.connectedCallback(); + console.log("connected callback------") + } + + override disconnectedCallback(): void { + super.disconnectedCallback(); + console.log("DISconnected callback------") + } + + override destroy(): void { + super.destroy(); + console.log("split view ot destroyed") + } + override render() { return this._variants ? html`
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 2912be0036..4ff96f8179 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 @@ -7,9 +7,6 @@ import { customElement, state, css, html } from '@umbraco-cms/backoffice/externa import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; @customElement('umb-media-workspace-editor') export class UmbMediaWorkspaceEditorElement extends UmbLitElement { - // - // 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. [NL] - private splitViewElement = new UmbMediaWorkspaceSplitViewElement(); @state() _routes?: Array; @@ -49,7 +46,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variantA.unique + '_&_' + variantB.unique, - component: this.splitViewElement, + component: UmbMediaWorkspaceSplitViewElement, setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); @@ -66,7 +63,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variant.unique, - component: this.splitViewElement, + component: UmbMediaWorkspaceSplitViewElement, setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts index b44cf47bd6..9c076a5b5f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts @@ -8,9 +8,6 @@ import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/r @customElement('umb-member-workspace-editor') export class UmbMemberWorkspaceEditorElement extends UmbLitElement { - // - // 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. [NL] - private splitViewElement = new UmbMemberWorkspaceSplitViewElement(); #workspaceContext?: typeof UMB_MEMBER_WORKSPACE_CONTEXT.TYPE; @@ -51,7 +48,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variantA.unique + '_&_' + variantB.unique, - component: this.splitViewElement, + component: UmbMemberWorkspaceSplitViewElement, setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); @@ -68,7 +65,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variant.unique, - component: this.splitViewElement, + component: UmbMemberWorkspaceSplitViewElement, setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); From 6adb6e3ff7f93ceca10f4fd5f3c5e8ea4e3a6cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 12:25:55 +0200 Subject: [PATCH 17/23] comment and fixing index --- .../document-blueprint-workspace-editor.element.ts | 10 ---------- .../workspace/document-workspace-editor.element.ts | 3 ++- .../media/workspace/media-workspace-editor.element.ts | 10 ---------- .../workspace/member-workspace-editor.element.ts | 10 ---------- 4 files changed, 2 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts index 59411728e2..b4404e770f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts @@ -85,17 +85,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, }); - const oldValue = this._routes; - - // is there any differences in the amount ot the paths? [NL] - // TODO: if we make a memorization function as the observer, we can avoid this check and avoid the whole build of routes. [NL] - if (oldValue && oldValue.length === routes.length) { - // is there any differences in the paths? [NL] - const hasDifferences = oldValue.some((route, index) => route.path !== routes[index].path); - if (!hasDifferences) return; - } this._routes = routes; - this.requestUpdate('_routes', oldValue); } private _gotWorkspaceRoute = (e: UmbRouterSlotInitEvent) => { 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 584ae703cd..83591487b4 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 @@ -101,7 +101,8 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { const route = routes.find((route) => route.path === this.#appCulture); if (!route) { - history.pushState({}, '', `${this.#workspaceRoute}/${routes[routes.length - 2].path}`); + // TODO: Notice: here is a specific index used for fallback, this could be made more solid [NL] + history.pushState({}, '', `${this.#workspaceRoute}/${routes[routes.length - 3].path}`); return; } 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 247510d0d3..e9ebf9bd2e 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 @@ -85,17 +85,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, }); - const oldValue = this._routes; - - // is there any differences in the amount ot the paths? [NL] - // TODO: if we make a memorization function as the observer, we can avoid this check and avoid the whole build of routes. [NL] - if (oldValue && oldValue.length === routes.length) { - // is there any differences in the paths? [NL] - const hasDifferences = oldValue.some((route, index) => route.path !== routes[index].path); - if (!hasDifferences) return; - } this._routes = routes; - this.requestUpdate('_routes', oldValue); } private _gotWorkspaceRoute = (e: UmbRouterSlotInitEvent) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts index 91c2f4abcb..e18cc89526 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts @@ -87,17 +87,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement, }); - const oldValue = this._routes; - - // is there any differences in the amount ot the paths? [NL] - // TODO: if we make a memorization function as the observer, we can avoid this check and avoid the whole build of routes. [NL] - if (oldValue && oldValue.length === routes.length) { - // is there any differences in the paths? [NL] - const hasDifferences = oldValue.some((route, index) => route.path !== routes[index].path); - if (!hasDifferences) return; - } this._routes = routes; - this.requestUpdate('_routes', oldValue); } private _gotWorkspaceRoute = (e: UmbRouterSlotInitEvent) => { From 30922fbacbf6c8a34b38e98301839a823d24ca58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 13:05:33 +0200 Subject: [PATCH 18/23] fix route resolve race condition --- .../src/external/router-slot/router-slot.ts | 24 +++++++++++++++---- .../edit/content-editor-properties.element.ts | 1 - .../workspace-editor.element.ts | 2 -- .../workspace-split-view.context.ts | 4 ++-- .../workspace-split-view.element.ts | 2 -- ...workspace-split-view-manager.controller.ts | 1 - .../document-workspace-split-view.element.ts | 18 +------------- 7 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts b/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts index 85ca8d15d8..6c60cdee95 100644 --- a/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts +++ b/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts @@ -45,6 +45,11 @@ ensureAnchorHistory(); * @event changestate - Dispatched when the router slot state changes. */ export class RouterSlot extends HTMLElement implements IRouterSlot { + /** + * Method to cancel navigation if changed. + */ + private _cancelNavigation ?:() => void; + /** * Listeners on the router. */ @@ -200,9 +205,13 @@ export class RouterSlot extends HTMLElement implements IRouter // If navigate is not determined, then we will check if we have a route match. If not then we will re-render. [NL] navigate = this._routeMatch === null; if (navigate === false) { - const newMatch = this.getRouteMatch(); - // Check if this match matches the current match (aka. If the path has changed), if so we should navigate. [NL] - navigate = this._routeMatch?.route.path !== newMatch?.route.path; + if (this.isConnected) { + const newMatch = this.getRouteMatch(); + // Check if this match matches the current match (aka. If the path has changed), if so we should navigate. [NL] + if(newMatch) { + navigate = shouldNavigate(this.match, newMatch); + } + } } } @@ -327,10 +336,17 @@ export class RouterSlot extends HTMLElement implements IRouter // Only change route if its a new route. const navigate = shouldNavigate(this.match, match); if (navigate) { + + // If another navigation is still begin resolved in this very moment, then we need to cancel that so it does not end up overriding this new navigation.[NL] + this._cancelNavigation?.(); // Listen for another push state event. If another push state event happens // while we are about to navigate we have to cancel. let navigationInvalidated = false; - const cancelNavigation = () => (navigationInvalidated = true); + const cancelNavigation = () => { + navigationInvalidated = true; + this._cancelNavigation = undefined; + }; + this._cancelNavigation = cancelNavigation; const removeChangeListener: EventListenerSubscription = addListener( GLOBAL_ROUTER_EVENTS_TARGET, 'changestate', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor-properties.element.ts index aa03023a26..18173790f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/views/edit/content-editor-properties.element.ts @@ -41,7 +41,6 @@ export class UmbContentWorkspaceViewEditPropertiesElement extends UmbLitElement ); }); this.consumeContext(UMB_PROPERTY_DATASET_CONTEXT, (datasetContext) => { - console.log(this, datasetContext) this.#variantId = datasetContext.getVariantId(); this.#generatePropertyDataPath(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts index 485f8569bd..ccac1676b7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts @@ -49,8 +49,6 @@ export class UmbWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - console.log("workspace editor created.") - new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'workspaceView', null, (workspaceViews) => { this._workspaceViews = workspaceViews.map((view) => view.manifest); this._createRoutes(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.context.ts index 73c074a102..9a39d69ae0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.context.ts @@ -1,9 +1,9 @@ -import { UMB_VARIANT_WORKSPACE_CONTEXT } from '../../contexts/index.js'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbNumberState } from '@umbraco-cms/backoffice/observable-api'; +import { UMB_VARIANT_WORKSPACE_CONTEXT } from '../../contexts/index.js'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; export class UmbWorkspaceSplitViewContext extends UmbContextBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.element.ts index 75b4ea0180..ab5edb1996 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view.element.ts @@ -35,8 +35,6 @@ export class UmbWorkspaceSplitViewElement extends UmbLitElement { override render() { - console.log("workspace split view render") - return html` { this._variants = variants; - console.log("______variants: ", variants[0]) }, '_observeActiveVariantsInfo', ); } - override connectedCallback(): void { - super.connectedCallback(); - console.log("connected callback------") - } - - override disconnectedCallback(): void { - super.disconnectedCallback(); - console.log("DISconnected callback------") - } - - override destroy(): void { - super.destroy(); - console.log("split view ot destroyed") - } - override render() { return this._variants ? html`
From 2f19aafa044b4e81d071db6b0280c66a08391d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 13:10:17 +0200 Subject: [PATCH 19/23] remove comments --- .../src/packages/core/section/section-default.element.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts index ded72f1ac6..000af08c74 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts @@ -101,15 +101,12 @@ export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectio }), ); - //this.#debouncedCreateRoutes(routes); this.#createRoutes(routes); }, 'umbRouteExtensionApisInitializer', ); } - //#debouncedCreateRoutes = debounce(this.#createRoutes, 50); - #createRoutes(routes: Array) { this._routes = [ ...routes, From 10d560544f8af117812f5ffa378c6cc5d8d4aebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 13:28:35 +0200 Subject: [PATCH 20/23] remove out dated comment --- .../src/packages/block/block/workspace/manifests.ts | 4 ---- .../src/packages/core/section/section-default.element.ts | 8 +++----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts index 1249f74d6d..e6f79b4710 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts @@ -75,10 +75,6 @@ export const manifests: Array = [ }, { alias: 'Umb.Condition.BlockWorkspaceHasSettings', - }, - { - alias: 'Umb.Condition.Switch', - frequency: '2000' } ], } as any, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts index 000af08c74..f76b1d40e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts @@ -86,13 +86,11 @@ export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectio const api = await createExtensionApi(this, extensionController.manifest); return { - path: + path: ( api?.getPath?.() || extensionController.manifest.meta?.path || - aliasToPath(extensionController.manifest.alias), - // be aware that this is kind of a hack to pass the manifest element to the router. But as the two resolve components - // in a similar way. I currently find it more safe to let the router do the component resolving instead - // of replicating it as a custom resolver here. + aliasToPath(extensionController.manifest.alias) + ), component: () => createExtensionElement(extensionController.manifest), setup: (element: PageComponent, info: IRoutingInfo) => { api?.setup?.(element, info); From 67144b463e61f32c81bbdac8ceccab8c9c065d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 13:35:58 +0200 Subject: [PATCH 21/23] re-implemented shared route component --- .../src/external/router-slot/router-slot.ts | 17 ++++++++++++----- .../document-workspace-editor.element.ts | 6 +++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts b/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts index 6c60cdee95..1a2bec962f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts +++ b/src/Umbraco.Web.UI.Client/src/external/router-slot/router-slot.ts @@ -409,16 +409,23 @@ export class RouterSlot extends HTMLElement implements IRouter return cancel(); } - // Remove the old page by clearing the slot - this.clearChildren(); + // We have some routes that share the same component instance, those should not be removed and re-appended [NL] + const isTheSameComponent = this.firstChild === page; + + if(!isTheSameComponent) { + // Remove the old page by clearing the slot + this.clearChildren(); + } // Store the new route match before we append the new page to the DOM. // We do this to ensure that we can find the match in the connectedCallback of the page. this._routeMatch = match; - if (page) { - // Append the new page - this.appendChild(page); + if(!isTheSameComponent) { + if (page) { + // Append the new page + this.appendChild(page); + } } } 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 83591487b4..5eb630c5ef 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 @@ -12,7 +12,7 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from './document-workspace.context-tok export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { // // 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. [NL] - //private splitViewElement = new UmbDocumentWorkspaceSplitViewElement(); + private splitViewElement = new UmbDocumentWorkspaceSplitViewElement(); #appLanguage?: typeof UMB_APP_LANGUAGE_CONTEXT.TYPE; #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; @@ -67,7 +67,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique still is URL Safe, cause its most likely not... [NL] path: variantA.unique + '_&_' + variantB.unique, - component: UmbDocumentWorkspaceSplitViewElement, + component: this.splitViewElement, setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); @@ -84,7 +84,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique still is URL Safe, cause its most likely not... [NL] path: variant.unique, - component: UmbDocumentWorkspaceSplitViewElement, + component: this.splitViewElement, setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); From 7d859b91d2f64be3c917587e0fb916b35e65bcdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 13:38:18 +0200 Subject: [PATCH 22/23] reintroduce other splitViewElements --- .../document-blueprint-workspace-editor.element.ts | 7 +++++-- .../media/workspace/media-workspace-editor.element.ts | 7 +++++-- .../member/workspace/member-workspace-editor.element.ts | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts index b4404e770f..f3c8ac32dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts @@ -8,6 +8,9 @@ import { UmbDocumentBlueprintWorkspaceSplitViewElement } from './document-bluepr @customElement('umb-document-blueprint-workspace-editor') export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { + // + // 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. [NL] + private splitViewElement = new UmbDocumentBlueprintWorkspaceSplitViewElement(); #workspaceContext?: typeof UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT.TYPE; @@ -46,7 +49,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variantA.unique + '_&_' + variantB.unique, - component: UmbDocumentBlueprintWorkspaceSplitViewElement, + component: this.splitViewElement, setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); @@ -63,7 +66,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variant.unique, - component: UmbDocumentBlueprintWorkspaceSplitViewElement, + component: this.splitViewElement, setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); 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 e9ebf9bd2e..d7eaa87ced 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 @@ -7,6 +7,9 @@ import { customElement, state, css, html } from '@umbraco-cms/backoffice/externa import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; @customElement('umb-media-workspace-editor') export class UmbMediaWorkspaceEditorElement extends UmbLitElement { + // + // 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. [NL] + private splitViewElement = new UmbMediaWorkspaceSplitViewElement(); @state() _routes?: Array; @@ -46,7 +49,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variantA.unique + '_&_' + variantB.unique, - component: UmbMediaWorkspaceSplitViewElement, + component: this.splitViewElement, setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); @@ -63,7 +66,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variant.unique, - component: UmbMediaWorkspaceSplitViewElement, + component: this.splitViewElement, setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts index e18cc89526..5bbe5e974e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts @@ -8,6 +8,9 @@ import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/r @customElement('umb-member-workspace-editor') export class UmbMemberWorkspaceEditorElement extends UmbLitElement { + // + // 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. [NL] + private splitViewElement = new UmbMemberWorkspaceSplitViewElement(); #workspaceContext?: typeof UMB_MEMBER_WORKSPACE_CONTEXT.TYPE; @@ -48,7 +51,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variantA.unique + '_&_' + variantB.unique, - component: UmbMemberWorkspaceSplitViewElement, + component: this.splitViewElement, setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); @@ -65,7 +68,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variant.unique, - component: UmbMemberWorkspaceSplitViewElement, + component: this.splitViewElement, setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); From 5f2fe04abacd17f20f0c87b62a247762abf72259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 28 Jun 2024 15:10:56 +0200 Subject: [PATCH 23/23] import sorting --- .../block-grid-area-config-entry.element.ts | 2 +- .../block-grid-areas-container.element.ts | 4 ++-- .../context/block-grid-entry.context.ts | 18 +++++++++--------- .../block-grid-scale-manager.controller.ts | 2 +- ...ditor-ui-block-grid-areas-config.element.ts | 9 ++++----- .../core/property/property/property.context.ts | 4 ++-- 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/block-grid-area-config-entry.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/block-grid-area-config-entry.element.ts index 1254987417..70b4e30ee5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/block-grid-area-config-entry.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/block-grid-area-config-entry.element.ts @@ -1,7 +1,7 @@ -import { UmbBlockGridAreaConfigEntryContext } from './block-grid-area-config-entry.context.js'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { html, css, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbBlockGridAreaConfigEntryContext } from './block-grid-area-config-entry.context.js'; import '../block-grid-block/index.js'; import '../block-scale-handler/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-areas-container/block-grid-areas-container.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-areas-container/block-grid-areas-container.element.ts index 567c471be8..966d63ce0c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-areas-container/block-grid-areas-container.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-areas-container/block-grid-areas-container.element.ts @@ -1,7 +1,7 @@ -import { UMB_BLOCK_GRID_MANAGER_CONTEXT } from '../../context/block-grid-manager.context-token.js'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_BLOCK_GRID_ENTRY_CONTEXT, type UmbBlockGridTypeAreaType } from '@umbraco-cms/backoffice/block-grid'; import { css, customElement, html, repeat, state } from '@umbraco-cms/backoffice/external/lit'; +import { UMB_BLOCK_GRID_MANAGER_CONTEXT } from '../../context/block-grid-manager.context-token.js'; +import { UMB_BLOCK_GRID_ENTRY_CONTEXT, type UmbBlockGridTypeAreaType } from '@umbraco-cms/backoffice/block-grid'; import '../block-grid-entries/index.js'; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entry.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entry.context.ts index fcbfbd8dce..eadf1ebeb9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entry.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entry.context.ts @@ -1,13 +1,4 @@ -import { closestColumnSpanOption } from '../utils/index.js'; -import { UMB_BLOCK_GRID_MANAGER_CONTEXT } from './block-grid-manager.context-token.js'; -import { UMB_BLOCK_GRID_ENTRIES_CONTEXT } from './block-grid-entries.context-token.js'; -import { - type UmbBlockGridScalableContext, - UmbBlockGridScaleManager, -} from './block-grid-scale-manager/block-grid-scale-manager.controller.js'; -import { UmbBlockEntryContext } from '@umbraco-cms/backoffice/block'; import type { UmbContentTypeModel, UmbPropertyTypeModel } from '@umbraco-cms/backoffice/content-type'; -import type { UmbBlockGridTypeModel, UmbBlockGridLayoutModel } from '@umbraco-cms/backoffice/block-grid'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbArrayState, @@ -17,6 +8,15 @@ import { appendToFrozenArray, observeMultiple, } from '@umbraco-cms/backoffice/observable-api'; +import { closestColumnSpanOption } from '../utils/index.js'; +import { UMB_BLOCK_GRID_MANAGER_CONTEXT } from './block-grid-manager.context-token.js'; +import { UMB_BLOCK_GRID_ENTRIES_CONTEXT } from './block-grid-entries.context-token.js'; +import { + type UmbBlockGridScalableContext, + UmbBlockGridScaleManager, +} from './block-grid-scale-manager/block-grid-scale-manager.controller.js'; +import { UmbBlockEntryContext } from '@umbraco-cms/backoffice/block'; +import type { UmbBlockGridTypeModel, UmbBlockGridLayoutModel } from '@umbraco-cms/backoffice/block-grid'; export class UmbBlockGridEntryContext extends UmbBlockEntryContext< diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-scale-manager/block-grid-scale-manager.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-scale-manager/block-grid-scale-manager.controller.ts index d969f6e914..4fcfdd1f75 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-scale-manager/block-grid-scale-manager.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-scale-manager/block-grid-scale-manager.controller.ts @@ -1,7 +1,7 @@ -import { closestColumnSpanOption } from '../../utils/index.js'; import { getAccumulatedValueOfIndex, getInterpolatedIndexOfPositionInWeightMap } from '@umbraco-cms/backoffice/utils'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { closestColumnSpanOption } from '../../utils/index.js'; // This might be more generic than Block Grid, but this is where it belongs currently: export interface UmbBlockGridScalableContext extends UmbControllerHost { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-areas-config/property-editor-ui-block-grid-areas-config.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-areas-config/property-editor-ui-block-grid-areas-config.element.ts index 64b8879589..9b884fb29c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-areas-config/property-editor-ui-block-grid-areas-config.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-areas-config/property-editor-ui-block-grid-areas-config.element.ts @@ -1,7 +1,3 @@ -import type { UmbBlockGridTypeAreaType } from '../../index.js'; -import { UMB_BLOCK_GRID_DEFAULT_LAYOUT_STYLESHEET } from '../../context/block-grid-manager.context.js'; -import { UMB_BLOCK_GRID_AREA_TYPE_WORKSPACE_MODAL } from '../../components/block-grid-area-config-entry/index.js'; -import { UmbBlockGridAreaTypeEntriesContext } from './block-grid-area-type-entries.context.js'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; @@ -13,6 +9,10 @@ import { import { UmbId } from '@umbraco-cms/backoffice/id'; import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/router'; import { incrementString } from '@umbraco-cms/backoffice/utils'; +import { UMB_BLOCK_GRID_AREA_TYPE_WORKSPACE_MODAL } from '../../components/block-grid-area-config-entry/index.js'; +import { UMB_BLOCK_GRID_DEFAULT_LAYOUT_STYLESHEET } from '../../context/block-grid-manager.context.js'; +import type { UmbBlockGridTypeAreaType } from '../../index.js'; +import { UmbBlockGridAreaTypeEntriesContext } from './block-grid-area-type-entries.context.js'; @customElement('umb-property-editor-ui-block-grid-areas-config') export class UmbPropertyEditorUIBlockGridAreasConfigElement @@ -127,7 +127,6 @@ export class UmbPropertyEditorUIBlockGridAreasConfigElement //TODO: open area edit workspace } - // TODO: Needs localizations: override render() { return this._areaGridColumns ? html`${this._styleElement} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.context.ts index 433cc5c813..830c8936fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.context.ts @@ -1,5 +1,3 @@ -import { UMB_PROPERTY_DATASET_CONTEXT } from '../property-dataset/index.js'; -import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { @@ -11,6 +9,8 @@ import { UmbStringState, } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UMB_PROPERTY_DATASET_CONTEXT } from '../property-dataset/index.js'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbPropertyEditorConfigProperty } from '@umbraco-cms/backoffice/property-editor'; import { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry';