Skip to content

Commit d239849

Browse files
Include property aliases in compatible composition check (#19277)
* add method to get all property aliases * pass property aliases to composition modal * put in a box + adjust spacing * disable if doc type is not compatible for composing * compare with what is used for composition * add comment --------- Co-authored-by: Niels Lyngsø <[email protected]>
1 parent 6fd6319 commit d239849

File tree

4 files changed

+39
-4
lines changed

4 files changed

+39
-4
lines changed

src/Umbraco.Web.UI.Client/src/packages/content/content-type/modals/composition-picker/composition-picker-modal.element.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement<
3939
@state()
4040
private _usedForInheritance: Array<string> = [];
4141

42+
@state()
43+
private _usedForComposition: Array<string> = [];
44+
4245
override connectedCallback() {
4346
super.connectedCallback();
4447

@@ -53,6 +56,7 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement<
5356

5457
this._selection = this.data?.selection ?? [];
5558
this._usedForInheritance = this.data?.usedForInheritance ?? [];
59+
this._usedForComposition = this.data?.usedForComposition ?? [];
5660
this.modalContext?.setValue({ selection: this._selection });
5761

5862
const isNew = this.data!.isNew;
@@ -131,7 +135,9 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement<
131135
override render() {
132136
return html`
133137
<umb-body-layout headline="${this.localize.term('contentTypeEditor_compositions')}">
134-
${this._references.length ? this.#renderHasReference() : this.#renderAvailableCompositions()}
138+
<uui-box>
139+
${this._references.length ? this.#renderHasReference() : this.#renderAvailableCompositions()}
140+
</uui-box>
135141
<div slot="actions">
136142
<uui-button label=${this.localize.term('general_close')} @click=${this._rejectModal}></uui-button>
137143
${!this._references.length
@@ -213,11 +219,16 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement<
213219
(compositions) => compositions.unique,
214220
(compositions) => {
215221
const usedForInheritance = this._usedForInheritance.includes(compositions.unique);
222+
const usedForComposition = this._usedForComposition.includes(compositions.unique);
223+
/* The server will return isCompatible as false if the Doc Type is currently being used in a composition.
224+
Therefore, we need to account for this in the "isDisabled" check to ensure it remains enabled.
225+
Otherwise, it would become disabled and couldn't be deselected by the user. */
226+
const isDisabled = usedForInheritance || (compositions.isCompatible === false && !usedForComposition);
216227
return html`
217228
<uui-menu-item
218229
label=${this.localize.string(compositions.name)}
219230
?selectable=${!usedForInheritance}
220-
?disabled=${usedForInheritance}
231+
?disabled=${isDisabled}
221232
@selected=${() => this.#onSelectionAdd(compositions.unique)}
222233
@deselected=${() => this.#onSelectionRemove(compositions.unique)}
223234
?selected=${this._selection.find((unique) => unique === compositions.unique)}>
@@ -251,6 +262,10 @@ export class UmbCompositionPickerModalElement extends UmbModalBaseElement<
251262
align-items: center;
252263
gap: var(--uui-size-3);
253264
}
265+
266+
.compositions-list {
267+
margin-block: var(--uui-size-3);
268+
}
254269
`,
255270
];
256271
}

src/Umbraco.Web.UI.Client/src/packages/content/content-type/modals/composition-picker/composition-picker-modal.token.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface UmbCompositionPickerModalData {
55
compositionRepositoryAlias: string;
66
selection: Array<string>;
77
usedForInheritance: Array<string>;
8+
usedForComposition: Array<string>;
89
unique: string | null;
910
isElement: boolean;
1011
currentPropertyAliases: Array<string>;

src/Umbraco.Web.UI.Client/src/packages/content/content-type/structure/content-type-structure-manager.class.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,17 @@ export class UmbContentTypeStructureManager<
816816
);
817817
}
818818

819+
/**
820+
* Get all property aliases for the content type including inherited and composed content types.
821+
* @returns {Promise<Array<string>>} - A promise that will be resolved with the list of all content type property aliases.
822+
*/
823+
async getContentTypePropertyAliases() {
824+
return this.#contentTypes
825+
.getValue()
826+
.flatMap((x) => x.properties?.map((y) => y.alias) ?? [])
827+
.filter(UmbFilterDuplicateStrings);
828+
}
829+
819830
#clear() {
820831
this.#contentTypeObservers.forEach((observer) => observer.destroy());
821832
this.#contentTypeObservers = [];

src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor.element.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,17 +389,25 @@ export class UmbContentTypeDesignEditorElement extends UmbLitElement implements
389389
const currentOwnerCompositionCompositions = currentOwnerCompositions.filter(
390390
(composition) => composition.compositionType === CompositionTypeModel.COMPOSITION,
391391
);
392+
393+
const currentOwnerCompositionCompositionUniques = currentOwnerCompositionCompositions.map(
394+
(composition) => composition.contentType.unique,
395+
);
396+
392397
const currentOwnerInheritanceCompositions = currentOwnerCompositions.filter(
393398
(composition) => composition.compositionType === CompositionTypeModel.INHERITANCE,
394399
);
395400

401+
const currentPropertyAliases = await this.#workspaceContext.structure.getContentTypePropertyAliases();
402+
396403
const compositionConfiguration = {
397404
compositionRepositoryAlias: this._compositionRepositoryAlias,
398405
unique: unique,
399-
selection: currentOwnerCompositionCompositions.map((composition) => composition.contentType.unique),
406+
selection: currentOwnerCompositionCompositionUniques,
400407
usedForInheritance: currentInheritanceCompositions.map((composition) => composition.contentType.unique),
408+
usedForComposition: currentOwnerCompositionCompositionUniques,
401409
isElement: ownerContentType.isElement,
402-
currentPropertyAliases: [],
410+
currentPropertyAliases,
403411
isNew: this.#workspaceContext.getIsNew()!,
404412
};
405413

0 commit comments

Comments
 (0)