* feat: gets hints and assigns to variants to enable the view to show a badge if there is a hint * feat: find the first hint on the non-active variant * feat: protect against non-variants * feat: ignore invariant variants * feat: adds a render method for hints * chore: removes comment * only add a new hint if the weight is higher
This commit is contained in:
@@ -10,6 +10,8 @@ import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui';
|
|||||||
import type { UmbEntityVariantModel, UmbEntityVariantOptionModel } from '@umbraco-cms/backoffice/variant';
|
import type { UmbEntityVariantModel, UmbEntityVariantOptionModel } from '@umbraco-cms/backoffice/variant';
|
||||||
import type { UUIInputElement, UUIPopoverContainerElement } from '@umbraco-cms/backoffice/external/uui';
|
import type { UUIInputElement, UUIPopoverContainerElement } from '@umbraco-cms/backoffice/external/uui';
|
||||||
import type { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api';
|
import type { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api';
|
||||||
|
import { UMB_HINT_CONTEXT } from '@umbraco-cms/backoffice/hint';
|
||||||
|
import type { UmbHint, UmbVariantHint } from '@umbraco-cms/backoffice/hint';
|
||||||
|
|
||||||
@customElement('umb-workspace-split-view-variant-selector')
|
@customElement('umb-workspace-split-view-variant-selector')
|
||||||
export class UmbWorkspaceSplitViewVariantSelectorElement<
|
export class UmbWorkspaceSplitViewVariantSelectorElement<
|
||||||
@@ -96,8 +98,35 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
|
|||||||
this.#observeDatasetContext();
|
this.#observeDatasetContext();
|
||||||
this.#observeCurrentVariant();
|
this.#observeCurrentVariant();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.consumeContext(UMB_HINT_CONTEXT, (context) => {
|
||||||
|
this.observe(
|
||||||
|
context?.descendingHints(),
|
||||||
|
(hints) => {
|
||||||
|
this._hintMap.clear();
|
||||||
|
hints?.forEach((hint) => {
|
||||||
|
if (this.#isVariantHint(hint) && hint.variantId) {
|
||||||
|
// Add the hint if there is no existing hint for this variantId or if the existing hint has a lower weight
|
||||||
|
const existingHint = this._hintMap.get(hint.variantId.toString());
|
||||||
|
if (!existingHint || existingHint.weight < hint.weight) {
|
||||||
|
this._hintMap.set(hint.variantId.toString(), hint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.requestUpdate('_hintMap');
|
||||||
|
},
|
||||||
|
'umbObserveHints',
|
||||||
|
);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#isVariantHint(hint: UmbHint): hint is UmbVariantHint {
|
||||||
|
return hint && 'variantId' in hint;
|
||||||
|
}
|
||||||
|
|
||||||
|
@state()
|
||||||
|
private _hintMap = new Map<string, UmbVariantHint>();
|
||||||
|
|
||||||
async #observeVariants(workspaceContext?: UmbVariantDatasetWorkspaceContext) {
|
async #observeVariants(workspaceContext?: UmbVariantDatasetWorkspaceContext) {
|
||||||
this.observe(
|
this.observe(
|
||||||
workspaceContext?.variantOptions,
|
workspaceContext?.variantOptions,
|
||||||
@@ -302,6 +331,16 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
|
|||||||
override render() {
|
override render() {
|
||||||
if (!this._variantId) return nothing;
|
if (!this._variantId) return nothing;
|
||||||
|
|
||||||
|
let firstHintOnInactiveVariant: UmbVariantHint | undefined;
|
||||||
|
|
||||||
|
if (this._activeVariant) {
|
||||||
|
const hintsOrderedByWeight = Array.from(this._hintMap.values()).sort((a, b) => (b.weight || 0) - (a.weight || 0));
|
||||||
|
firstHintOnInactiveVariant = hintsOrderedByWeight.find((hint) => {
|
||||||
|
if (!hint.variantId) return false;
|
||||||
|
return !hint.variantId.isInvariant() && hint.variantId.compare(this._activeVariant!) === false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<uui-input
|
<uui-input
|
||||||
id="name-input"
|
id="name-input"
|
||||||
@@ -330,6 +369,7 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
|
|||||||
${this.#getVariantSpecInfo(this._activeVariant)}
|
${this.#getVariantSpecInfo(this._activeVariant)}
|
||||||
${this.#renderReadOnlyTag(this._activeVariant?.culture)}
|
${this.#renderReadOnlyTag(this._activeVariant?.culture)}
|
||||||
<uui-symbol-expand .open=${this._variantSelectorOpen}></uui-symbol-expand>
|
<uui-symbol-expand .open=${this._variantSelectorOpen}></uui-symbol-expand>
|
||||||
|
${this.#renderHintBadge(firstHintOnInactiveVariant)}
|
||||||
</uui-button>
|
</uui-button>
|
||||||
${this._activeVariants.length > 1
|
${this._activeVariants.length > 1
|
||||||
? html`
|
? html`
|
||||||
@@ -360,8 +400,11 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
|
|||||||
const variantId = UmbVariantId.Create(variantOption);
|
const variantId = UmbVariantId.Create(variantOption);
|
||||||
const notCreated = this.#isCreateMode(variantOption, variantId);
|
const notCreated = this.#isCreateMode(variantOption, variantId);
|
||||||
const subVariantOptions = this.#getSegmentVariantOptionsForCulture(variantOption, variantId);
|
const subVariantOptions = this.#getSegmentVariantOptionsForCulture(variantOption, variantId);
|
||||||
|
const hint = this._hintMap.get(variantId.toString());
|
||||||
|
const active = this.#isVariantActive(variantId);
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<div class="variant culture-variant ${this.#isVariantActive(variantId) ? 'selected' : ''}">
|
<div class="variant culture-variant ${active ? 'selected' : ''}">
|
||||||
${this._variesBySegment && this.#isCreated(variantOption) && subVariantOptions.length > 0
|
${this._variesBySegment && this.#isCreated(variantOption) && subVariantOptions.length > 0
|
||||||
? html`<div class="expand-area">${this.#renderExpandToggle(variantId)}</div>`
|
? html`<div class="expand-area">${this.#renderExpandToggle(variantId)}</div>`
|
||||||
: nothing}
|
: nothing}
|
||||||
@@ -381,6 +424,7 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="specs-info">${this.#getVariantSpecInfo(variantOption)}</div>
|
<div class="specs-info">${this.#getVariantSpecInfo(variantOption)}</div>
|
||||||
|
${this.#renderHintBadge(!active ? hint : undefined)}
|
||||||
</button>
|
</button>
|
||||||
${this.#renderSplitViewButton(variantOption)}
|
${this.#renderSplitViewButton(variantOption)}
|
||||||
</div>
|
</div>
|
||||||
@@ -390,6 +434,13 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#renderHintBadge(hint?: UmbVariantHint) {
|
||||||
|
if (!hint) return nothing;
|
||||||
|
return html`<div class="hint">
|
||||||
|
<uui-badge .color=${hint.color ?? 'default'} ?attention=${hint.color === 'invalid'}>${hint.text}</uui-badge>
|
||||||
|
</div>`;
|
||||||
|
}
|
||||||
|
|
||||||
#isCreated(variantOption: VariantOptionModelType) {
|
#isCreated(variantOption: VariantOptionModelType) {
|
||||||
return (
|
return (
|
||||||
variantOption.variant?.state &&
|
variantOption.variant?.state &&
|
||||||
|
|||||||
Reference in New Issue
Block a user