Skip to content

Commit 56569af

Browse files
Handle segmentation when segment alias includes underscore character(s) (#19782)
* move variant fragment split logic into splitview manager * further centralise split logic into umbVariantId * show segment selector if any exist * invariant null * chore: run eslint:fix * chore(eslint): generate a UBM_ constant --------- Co-authored-by: Jacob Overgaard <[email protected]>
1 parent fc3d8c8 commit 56569af

File tree

7 files changed

+38
-55
lines changed

7 files changed

+38
-55
lines changed

src/Umbraco.Web.UI.Client/src/apps/preview/apps/preview-segment.element.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class UmbPreviewSegmentElement extends UmbLitElement {
4747
}
4848

4949
override render() {
50-
if (this._segments.length <= 1) return nothing;
50+
if (!this._segments.length) return nothing;
5151
return html`
5252
<uui-button look="primary" popovertarget="segments-popover">
5353
<div>

src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@ export class UmbVariantId {
3737
}
3838

3939
public static FromString(str: string): UmbVariantId {
40-
const split = str.split('_');
41-
const culture = split[0] === UMB_INVARIANT_CULTURE ? null : split[0];
42-
const segment = split[1] ?? null;
40+
const firstUnderscoreIndex = str.indexOf('_');
41+
let culture: string | null = firstUnderscoreIndex === -1 ? str : str.substring(0, firstUnderscoreIndex);
42+
culture = culture === UMB_INVARIANT_CULTURE ? null : culture;
43+
44+
const segment = firstUnderscoreIndex === -1 ? null : str.substring(firstUnderscoreIndex + 1) || null;
45+
4346
return Object.freeze(new UmbVariantId(culture, segment));
4447
}
4548

src/Umbraco.Web.UI.Client/src/packages/core/workspace/controllers/workspace-split-view-manager.controller.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export type UmbActiveVariant = {
1313
// eslint-disable-next-line @typescript-eslint/naming-convention
1414
export type ActiveVariant = UmbActiveVariant;
1515

16+
const UBM_VARIANT_DELIMITER = '_&_';
17+
1618
/**
1719
* @class UmbWorkspaceSplitViewManager
1820
* @description - Class managing the split view state for a workspace context.
@@ -61,7 +63,9 @@ export class UmbWorkspaceSplitViewManager {
6163
const newVariants = [...activeVariants];
6264
newVariants[index] = { index, culture: variantId.culture, segment: variantId.segment };
6365

64-
const variantPart: string = newVariants.map((v) => UmbVariantId.Create(v).toString()).join('_&_');
66+
const variantPart: string = newVariants
67+
.map((v) => UmbVariantId.Create(v).toString())
68+
.join(UBM_VARIANT_DELIMITER);
6569

6670
history.pushState(null, '', `${workspaceRoute}/${variantPart}`);
6771
return true;
@@ -78,7 +82,11 @@ export class UmbWorkspaceSplitViewManager {
7882
const currentVariant = this.getActiveVariants()[0];
7983
const workspaceRoute = this.getWorkspaceRoute();
8084
if (currentVariant && workspaceRoute) {
81-
history.pushState(null, '', `${workspaceRoute}/${UmbVariantId.Create(currentVariant)}_&_${newVariant}`);
85+
history.pushState(
86+
null,
87+
'',
88+
`${workspaceRoute}/${UmbVariantId.Create(currentVariant)}${UBM_VARIANT_DELIMITER}${newVariant}`,
89+
);
8290
return true;
8391
}
8492
return false;
@@ -91,12 +99,24 @@ export class UmbWorkspaceSplitViewManager {
9199
if (activeVariants && index < activeVariants.length) {
92100
const newVariants = activeVariants.filter((x) => x.index !== index);
93101

94-
const variantPart: string = newVariants.map((v) => UmbVariantId.Create(v)).join('_&_');
102+
const variantPart: string = newVariants.map((v) => UmbVariantId.Create(v)).join(UBM_VARIANT_DELIMITER);
95103

96104
history.pushState(null, '', `${workspaceRoute}/${variantPart}`);
97105
return true;
98106
}
99107
}
100108
return false;
101109
}
110+
111+
public setVariantParts(routeFragment: string) {
112+
const variantSplit = routeFragment.split(UBM_VARIANT_DELIMITER);
113+
variantSplit.forEach((part, index) => {
114+
this.handleVariantFolderPart(index, part);
115+
});
116+
}
117+
118+
public handleVariantFolderPart(index: number, folderPart: string) {
119+
const variantId = UmbVariantId.FromString(folderPart);
120+
this.setActiveVariant(index, variantId.culture, variantId.segment);
121+
}
102122
}

src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,6 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement {
5151
);
5252
}
5353

54-
private _handleVariantFolderPart(index: number, folderPart: string) {
55-
const variantSplit = folderPart.split('_');
56-
const culture = variantSplit[0];
57-
const segment = variantSplit[1];
58-
this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment);
59-
}
60-
6154
private async _generateRoutes() {
6255
// Generate split view routes for all available routes
6356
const routes: Array<UmbRoute> = [];
@@ -71,10 +64,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement {
7164
component: this._splitViewElement,
7265
setup: (_component, info) => {
7366
// Set split view/active info..
74-
const variantSplit = info.match.fragments.consumed.split('_&_');
75-
variantSplit.forEach((part, index) => {
76-
this._handleVariantFolderPart(index, part);
77-
});
67+
this.#workspaceContext?.splitView.setVariantParts(info.match.fragments.consumed);
7868
},
7969
});
8070
});
@@ -89,7 +79,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement {
8979
setup: (_component, info) => {
9080
// cause we might come from a split-view, we need to reset index 1.
9181
this.#workspaceContext?.splitView.removeActiveVariant(1);
92-
this._handleVariantFolderPart(0, info.match.fragments.consumed);
82+
this.#workspaceContext?.splitView.handleVariantFolderPart(0, info.match.fragments.consumed);
9383
},
9484
});
9585
});

src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,6 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement {
5858
});
5959
}
6060

61-
#handleVariantFolderPart(index: number, folderPart: string) {
62-
const variantSplit = folderPart.split('_');
63-
const culture = variantSplit[0];
64-
const segment = variantSplit[1];
65-
this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment);
66-
}
67-
6861
#generateRoutes() {
6962
if (!this.#variants || !this.#appCulture) {
7063
this._routes = [];
@@ -83,10 +76,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement {
8376
component: this._splitViewElement,
8477
setup: (_component, info) => {
8578
// Set split view/active info..
86-
const variantSplit = info.match.fragments.consumed.split('_&_');
87-
variantSplit.forEach((part, index) => {
88-
this.#handleVariantFolderPart(index, part);
89-
});
79+
this.#workspaceContext?.splitView.setVariantParts(info.match.fragments.consumed);
9080
},
9181
});
9282
});
@@ -101,7 +91,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement {
10191
setup: (_component, info) => {
10292
// cause we might come from a split-view, we need to reset index 1.
10393
this.#workspaceContext?.splitView.removeActiveVariant(1);
104-
this.#handleVariantFolderPart(0, info.match.fragments.consumed);
94+
this.#workspaceContext?.splitView.handleVariantFolderPart(0, info.match.fragments.consumed);
10595
},
10696
});
10797
});

src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace-editor.element.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,6 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement {
5151
);
5252
}
5353

54-
private _handleVariantFolderPart(index: number, folderPart: string) {
55-
const variantSplit = folderPart.split('_');
56-
const culture = variantSplit[0];
57-
const segment = variantSplit[1];
58-
this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment);
59-
}
60-
6154
private async _generateRoutes() {
6255
// Generate split view routes for all available routes
6356
const routes: Array<UmbRoute> = [];
@@ -71,10 +64,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement {
7164
component: this._splitViewElement,
7265
setup: (_component, info) => {
7366
// Set split view/active info..
74-
const variantSplit = info.match.fragments.consumed.split('_&_');
75-
variantSplit.forEach((part, index) => {
76-
this._handleVariantFolderPart(index, part);
77-
});
67+
this.#workspaceContext?.splitView.setVariantParts(info.match.fragments.consumed);
7868
},
7969
});
8070
});
@@ -89,7 +79,7 @@ export class UmbMediaWorkspaceEditorElement extends UmbLitElement {
8979
setup: (_component, info) => {
9080
// cause we might come from a split-view, we need to reset index 1.
9181
this.#workspaceContext?.splitView.removeActiveVariant(1);
92-
this._handleVariantFolderPart(0, info.match.fragments.consumed);
82+
this.#workspaceContext?.splitView.handleVariantFolderPart(0, info.match.fragments.consumed);
9383
},
9484
});
9585
});

src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,6 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement {
4747
);
4848
}
4949

50-
private _handleVariantFolderPart(index: number, folderPart: string) {
51-
const variantSplit = folderPart.split('_');
52-
const culture = variantSplit[0];
53-
const segment = variantSplit[1];
54-
this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment);
55-
}
56-
5750
private async _generateRoutes(variants: Array<UmbMemberVariantOptionModel>) {
5851
// Generate split view routes for all available routes
5952
const routes: Array<UmbRoute> = [];
@@ -67,10 +60,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement {
6760
component: this._splitViewElement,
6861
setup: (_component, info) => {
6962
// Set split view/active info..
70-
const variantSplit = info.match.fragments.consumed.split('_&_');
71-
variantSplit.forEach((part, index) => {
72-
this._handleVariantFolderPart(index, part);
73-
});
63+
this.#workspaceContext?.splitView.setVariantParts(info.match.fragments.consumed);
7464
},
7565
});
7666
});
@@ -85,7 +75,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement {
8575
setup: (_component, info) => {
8676
// cause we might come from a split-view, we need to reset index 1.
8777
this.#workspaceContext?.splitView.removeActiveVariant(1);
88-
this._handleVariantFolderPart(0, info.match.fragments.consumed);
78+
this.#workspaceContext?.splitView.handleVariantFolderPart(0, info.match.fragments.consumed);
8979
},
9080
});
9181
});

0 commit comments

Comments
 (0)