diff --git a/src/Umbraco.Web.UI.Client/src/apps/preview/apps/preview-segment.element.ts b/src/Umbraco.Web.UI.Client/src/apps/preview/apps/preview-segment.element.ts index 3e2974daf4bd..dc49628d49ff 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/preview/apps/preview-segment.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/preview/apps/preview-segment.element.ts @@ -47,7 +47,7 @@ export class UmbPreviewSegmentElement extends UmbLitElement { } override render() { - if (this._segments.length <= 1) return nothing; + if (!this._segments.length) return nothing; return html`
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts index a8a2f4be60ea..1909dbd90e87 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts @@ -37,9 +37,12 @@ export class UmbVariantId { } public static FromString(str: string): UmbVariantId { - const split = str.split('_'); - const culture = split[0] === UMB_INVARIANT_CULTURE ? null : split[0]; - const segment = split[1] ?? null; + const firstUnderscoreIndex = str.indexOf('_'); + let culture: string | null = firstUnderscoreIndex === -1 ? str : str.substring(0, firstUnderscoreIndex); + culture = culture === UMB_INVARIANT_CULTURE ? null : culture; + + const segment = firstUnderscoreIndex === -1 ? null : str.substring(firstUnderscoreIndex + 1) || null; + return Object.freeze(new UmbVariantId(culture, segment)); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-split-view-manager.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-split-view-manager.controller.ts index e365c08b3edd..a3d4074af5e9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-split-view-manager.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-split-view-manager.controller.ts @@ -18,6 +18,8 @@ export class UmbWorkspaceSplitViewManager { public readonly activeVariantsInfo = this.#activeVariantsInfo.asObservable(); public readonly splitViewActive = this.#activeVariantsInfo.asObservablePart((x) => x.length > 1); + private readonly VARIANT_DELIMITER = '_&_'; + private _routeBase?: string; public getWorkspaceRoute(): string | undefined { return this._routeBase; @@ -55,7 +57,7 @@ export class UmbWorkspaceSplitViewManager { const newVariants = [...activeVariants]; newVariants[index] = { index, culture: variantId.culture, segment: variantId.segment }; - const variantPart: string = newVariants.map((v) => UmbVariantId.Create(v).toString()).join('_&_'); + const variantPart: string = newVariants.map((v) => UmbVariantId.Create(v).toString()).join(this.VARIANT_DELIMITER); history.pushState(null, '', `${workspaceRoute}/${variantPart}`); return true; @@ -72,7 +74,7 @@ export class UmbWorkspaceSplitViewManager { const currentVariant = this.getActiveVariants()[0]; const workspaceRoute = this.getWorkspaceRoute(); if (currentVariant && workspaceRoute) { - history.pushState(null, '', `${workspaceRoute}/${UmbVariantId.Create(currentVariant)}_&_${newVariant}`); + history.pushState(null, '', `${workspaceRoute}/${UmbVariantId.Create(currentVariant)}${this.VARIANT_DELIMITER}${newVariant}`); return true; } return false; @@ -85,7 +87,7 @@ export class UmbWorkspaceSplitViewManager { if (activeVariants && index < activeVariants.length) { const newVariants = activeVariants.filter((x) => x.index !== index); - const variantPart: string = newVariants.map((v) => UmbVariantId.Create(v)).join('_&_'); + const variantPart: string = newVariants.map((v) => UmbVariantId.Create(v)).join(this.VARIANT_DELIMITER); history.pushState(null, '', `${workspaceRoute}/${variantPart}`); return true; @@ -93,4 +95,16 @@ export class UmbWorkspaceSplitViewManager { } return false; } + + public setVariantParts(routeFragment: string) { + const variantSplit = routeFragment.split(this.VARIANT_DELIMITER); + variantSplit.forEach((part, index) => { + this.handleVariantFolderPart(index, part); + }); + } + + public handleVariantFolderPart(index: number, folderPart: string) { + const variantId = UmbVariantId.FromString(folderPart); + this.setActiveVariant(index, variantId.culture, variantId.segment); + } } 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 875b5b00d255..f27e93b49a0e 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 @@ -51,13 +51,6 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { ); } - private _handleVariantFolderPart(index: number, folderPart: string) { - const variantSplit = folderPart.split('_'); - const culture = variantSplit[0]; - const segment = variantSplit[1]; - this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); - } - private async _generateRoutes() { // Generate split view routes for all available routes const routes: Array = []; @@ -71,10 +64,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { component: this.splitViewElement, setup: (_component, info) => { // Set split view/active info.. - const variantSplit = info.match.fragments.consumed.split('_&_'); - variantSplit.forEach((part, index) => { - this._handleVariantFolderPart(index, part); - }); + this.#workspaceContext?.splitView.setVariantParts(info.match.fragments.consumed); }, }); }); @@ -89,7 +79,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); - this._handleVariantFolderPart(0, info.match.fragments.consumed); + this.#workspaceContext?.splitView.handleVariantFolderPart(0, info.match.fragments.consumed); }, }); }); 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 b05120a59795..394cb2e64241 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 @@ -58,13 +58,6 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { }); } - #handleVariantFolderPart(index: number, folderPart: string) { - const variantSplit = folderPart.split('_'); - const culture = variantSplit[0]; - const segment = variantSplit[1]; - this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); - } - #generateRoutes() { if (!this.#variants || !this.#appCulture) { this._routes = []; @@ -83,10 +76,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { component: this.splitViewElement, setup: (_component, info) => { // Set split view/active info.. - const variantSplit = info.match.fragments.consumed.split('_&_'); - variantSplit.forEach((part, index) => { - this.#handleVariantFolderPart(index, part); - }); + this.#workspaceContext?.splitView.setVariantParts(info.match.fragments.consumed); }, }); }); @@ -101,7 +91,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); - this.#handleVariantFolderPart(0, info.match.fragments.consumed); + this.#workspaceContext?.splitView.handleVariantFolderPart(0, info.match.fragments.consumed); }, }); }); 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 172e15774b31..afd9eb80dfc6 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 @@ -51,13 +51,6 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { ); } - private _handleVariantFolderPart(index: number, folderPart: string) { - const variantSplit = folderPart.split('_'); - const culture = variantSplit[0]; - const segment = variantSplit[1]; - this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); - } - private async _generateRoutes() { // Generate split view routes for all available routes const routes: Array = []; @@ -71,10 +64,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { component: this.splitViewElement, setup: (_component, info) => { // Set split view/active info.. - const variantSplit = info.match.fragments.consumed.split('_&_'); - variantSplit.forEach((part, index) => { - this._handleVariantFolderPart(index, part); - }); + this.#workspaceContext?.splitView.setVariantParts(info.match.fragments.consumed); }, }); }); @@ -89,7 +79,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement { setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); - this._handleVariantFolderPart(0, info.match.fragments.consumed); + this.#workspaceContext?.splitView.handleVariantFolderPart(0, info.match.fragments.consumed); }, }); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts index 51d3b2a18a85..103302ab1c62 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts @@ -47,12 +47,6 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { ); } - private _handleVariantFolderPart(index: number, folderPart: string) { - const variantSplit = folderPart.split('_'); - const culture = variantSplit[0]; - const segment = variantSplit[1]; - this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); - } private async _generateRoutes(variants: Array) { // Generate split view routes for all available routes @@ -67,10 +61,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { component: this.splitViewElement, setup: (_component, info) => { // Set split view/active info.. - const variantSplit = info.match.fragments.consumed.split('_&_'); - variantSplit.forEach((part, index) => { - this._handleVariantFolderPart(index, part); - }); + this.#workspaceContext?.splitView.setVariantParts(info.match.fragments.consumed); }, }); }); @@ -85,7 +76,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); - this._handleVariantFolderPart(0, info.match.fragments.consumed); + this.#workspaceContext?.splitView.handleVariantFolderPart(0, info.match.fragments.consumed); }, }); });