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 0111815c45..e3ac2f07f7 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 @@ -16,7 +16,7 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< VariantOptionModelType extends UmbEntityVariantOptionModel = UmbEntityVariantOptionModel, > extends UmbLitElement { - @query('#variant-selector-popover') + @query('#popover') private _popoverElement?: UUIPopoverContainerElement; @state() @@ -52,6 +52,12 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< @state() private _variesBySegment = false; + @state() + private _expandedVariants: Array = []; + + @state() + private _cultureVariants: Array = []; + @state() private _labelDefault = ''; @@ -101,6 +107,7 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< workspaceContext.variantOptions, (variantOptions) => { this._variantOptions = (variantOptions as Array).sort(this._variantSorter); + this._cultureVariants = this._variantOptions.filter((variant) => variant.segment === null); this.#setReadOnlyCultures(); }, '_observeVariantOptions', @@ -238,6 +245,25 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< }, 200); } + #isReadOnly(culture: string | null) { + return this._readOnlyCultures.includes(culture); + } + + #toggleExpansion(event: PointerEvent, variantId: UmbVariantId) { + event.stopPropagation(); + this._expandedVariants = this.#isExpanded(variantId) + ? this._expandedVariants.filter((expandedVariant) => expandedVariant.equal(variantId) === false) + : [...this._expandedVariants, variantId]; + } + + #isExpanded(variantId: UmbVariantId) { + return this._expandedVariants.find((expandedVariant) => expandedVariant.equal(variantId)) !== undefined; + } + + #getSegmentVariantOptionsForCulture(variantId: UmbVariantId): Array { + return this._variantOptions.filter((variant) => variant.culture === variantId.culture && variant.segment !== null); + } + override render() { if (!this._variantId) return nothing; @@ -256,10 +282,10 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< ${this.#hasVariants() ? html` ${this.#getVariantSpecInfo(this._activeVariant)} @@ -279,14 +305,11 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< ${this.#hasVariants() ? html` - -
+ + @@ -296,14 +319,60 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< `; } - #renderListItem(variantOption: VariantOptionModelType) { + #renderCultureVariantOption(variantOption: VariantOptionModelType) { const variantId = UmbVariantId.Create(variantOption); return html` -
  • +
  • + this.#toggleExpansion(event, variantId)} + compact> + + + ${this.#renderSplitViewButton(variantOption)} + ${this.#isExpanded(variantId) + ? html` +
      + ${this.#getSegmentVariantOptionsForCulture(variantId).map((option) => + this.#renderSegmentVariantOption(option), + )} +
    + ` + : nothing} +
  • + `; + } + + #renderSegmentVariantOption(variantOption: VariantOptionModelType) { + const variantId = UmbVariantId.Create(variantOption); + + return html` +
  • +
    +