Skip to content

Commit 29edc58

Browse files
committed
Adding description to user groups
1 parent 84fecd3 commit 29edc58

File tree

9 files changed

+78
-22
lines changed

9 files changed

+78
-22
lines changed

src/Umbraco.Web.UI.Client/src/packages/core/backend-api/types.gen.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ export type CreateUserGroupRequestModel = {
419419
fallbackPermissions: Array<string>;
420420
permissions: Array<DocumentPermissionPresentationModel | DocumentPropertyValuePermissionPresentationModel | UnknownTypePermissionPresentationModel>;
421421
id?: string | null;
422+
description?: string | null;
422423
};
423424

424425
export type CreateUserRequestModel = {
@@ -2810,6 +2811,7 @@ export type UpdateUserDataRequestModel = {
28102811

28112812
export type UpdateUserGroupRequestModel = {
28122813
name: string;
2814+
description?: string | null;
28132815
alias: string;
28142816
icon?: string | null;
28152817
sections: Array<string>;
@@ -2925,6 +2927,7 @@ export type UserGroupResponseModel = {
29252927
id: string;
29262928
isDeletable: boolean;
29272929
aliasCanBeChanged: boolean;
2930+
description?: string | null;
29282931
};
29292932

29302933
export type UserInstallRequestModel = {

src/Umbraco.Web.UI.Client/src/packages/multi-url-picker/link-picker-modal/link-picker-modal.element.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ export class UmbLinkPickerModalElement extends UmbModalBaseElement<UmbLinkPicker
193193
const query = (event.target.value as string) ?? '';
194194
if (query.startsWith('#') || query.startsWith('?')) {
195195
this.#partialUpdateLink({ queryString: query });
196-
this.#validationContext.messages.removeMessageByKey('UmbLinkPickerValueValidator');
197196
return;
198197
}
199198

@@ -204,7 +203,6 @@ export class UmbLinkPickerModalElement extends UmbModalBaseElement<UmbLinkPicker
204203
} else {
205204
this.#partialUpdateLink({ queryString: '' });
206205
}
207-
this.#validationContext.messages.removeMessageByKey('UmbLinkPickerValueValidator');
208206
}
209207

210208
#onLinkTitleInput(event: UUIInputEvent) {
@@ -235,7 +233,6 @@ export class UmbLinkPickerModalElement extends UmbModalBaseElement<UmbLinkPicker
235233
type: 'external',
236234
url,
237235
});
238-
this.#validationContext.messages.removeMessageByKey('UmbLinkPickerValueValidator');
239236
}
240237

241238
async #onPickerSelection(event: UmbInputPickerEvent, type: 'document' | 'media') {

src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class UmbUserGroupCollectionServerDataSource implements UmbCollectionData
4545
mediaRootAccess: item.mediaRootAccess,
4646
mediaStartNode: item.mediaStartNode ? { unique: item.mediaStartNode.id } : null,
4747
name: item.name,
48+
description: item.description || null,
4849
permissions: item.permissions,
4950
sections: item.sections,
5051
unique: item.id,

src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ export class UmbUserGroupRefElement extends UmbElementMixin(UUIRefNodeElement) {
3636
this.#observeMediaStartNode(value);
3737
}
3838

39+
@property({ type: String })
40+
description: string | null = null;
41+
3942
@property({ type: Array })
4043
public get sections(): Array<string> {
4144
return [];
@@ -151,17 +154,19 @@ export class UmbUserGroupRefElement extends UmbElementMixin(UUIRefNodeElement) {
151154
}
152155

153156
#renderDetails() {
154-
const hasSections = this._sectionLabels.length;
155-
const hasDocument = !!this._documentLabel || this.documentRootAccess;
156-
const hasMedia = !!this._mediaLabel || this.mediaRootAccess;
157-
const hasUserPermissions = this._userPermissionLabels.length;
158-
159-
if (!hasSections && !hasDocument && !hasMedia && !hasUserPermissions) return;
160-
161157
return html`
162158
<div id="details">
163-
${this.#renderSections()} ${this.#renderDocumentStartNode()} ${this.#renderMediaStartNode()}
164-
${this.#renderUserPermissions()}
159+
${this.#renderDescription()} ${this.#renderSections()} ${this.#renderDocumentStartNode()}
160+
${this.#renderMediaStartNode()} ${this.#renderUserPermissions()}
161+
</div>
162+
`;
163+
}
164+
165+
#renderDescription() {
166+
if (!this.description) return;
167+
return html`
168+
<div>
169+
<small>${this.description}</small>
165170
</div>
166171
`;
167172
}

src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
114114
?mediaRootAccess=${userGroup.mediaRootAccess}
115115
.mediaStartNode=${!userGroup.mediaRootAccess ? userGroup.mediaStartNode?.unique : null}
116116
.sections=${userGroup.sections}
117+
.description=${userGroup.description}
117118
@selected=${(event: UUIMenuItemEvent) => this.#onSelected(event, userGroup)}
118119
@deselected=${(event: UUIMenuItemEvent) => this.#onDeselected(event, userGroup)}>
119120
${when(userGroup.icon, () => html`<umb-icon name=${userGroup.icon!} slot="icon"></umb-icon>`)}

src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class UmbUserGroupServerDataSource
4545
permissions: [],
4646
sections: [],
4747
unique: UmbId.new(),
48+
description: '',
4849
};
4950

5051
return { data };
@@ -98,6 +99,7 @@ export class UmbUserGroupServerDataSource
9899
permissions,
99100
sections: data.sections,
100101
unique: data.id,
102+
description: data.description ?? null,
101103
};
102104

103105
return { data: userGroup };
@@ -136,6 +138,7 @@ export class UmbUserGroupServerDataSource
136138
name: model.name,
137139
permissions,
138140
sections: model.sections,
141+
description: model.description,
139142
};
140143

141144
const { data, error } = await tryExecute(
@@ -186,6 +189,7 @@ export class UmbUserGroupServerDataSource
186189
name: model.name,
187190
permissions,
188191
sections: model.sections,
192+
description: model.description,
189193
};
190194

191195
const { error } = await tryExecute(

src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ export interface UmbUserGroupDetailModel {
1919
permissions: Array<any>;
2020
sections: Array<string>;
2121
unique: string;
22+
description: string | null;
2223
}

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

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { UmbUserGroupDetailModel } from '../../types.js';
33
import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from './user-group-workspace.context-token.js';
44
import type { UmbInputWithAliasElement } from '@umbraco-cms/backoffice/components';
55
import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit';
6+
import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui';
67
import { UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/icon';
78
import { umbFocus, UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
89
import { umbOpenModal } from '@umbraco-cms/backoffice/modal';
@@ -25,6 +26,9 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement {
2526
@state()
2627
private _icon?: UmbUserGroupDetailModel['icon'];
2728

29+
@state()
30+
private _description?: UmbUserGroupDetailModel['description'];
31+
2832
#workspaceContext?: typeof UMB_USER_GROUP_WORKSPACE_CONTEXT.TYPE;
2933

3034
constructor() {
@@ -36,6 +40,11 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement {
3640
});
3741
}
3842

43+
#onDescriptionChange(event: InputEvent & { target: UUIInputElement }) {
44+
const value = event.target.value.toString();
45+
this.#workspaceContext?.setDescription(value);
46+
}
47+
3948
#observeUserGroup() {
4049
this.observe(this.#workspaceContext?.isNew, (value) => (this._isNew = value), '_observeIsNew');
4150
this.observe(this.#workspaceContext?.name, (value) => (this._name = value), '_observeName');
@@ -46,6 +55,11 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement {
4655
'_observeAliasCanBeChanged',
4756
);
4857
this.observe(this.#workspaceContext?.icon, (value) => (this._icon = value), '_observeIcon');
58+
this.observe(
59+
this.#workspaceContext?.description,
60+
(value) => (this._description = value || ''),
61+
'_observeDescription',
62+
);
4963
}
5064

5165
#onNameAndAliasChange(event: InputEvent & { target: UmbInputWithAliasElement }) {
@@ -86,16 +100,25 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement {
86100
<umb-icon name=${this._icon || ''}></umb-icon>
87101
</uui-button>
88102
89-
<umb-input-with-alias
90-
id="name"
91-
label=${this.localize.term('placeholders_entername')}
92-
.value=${this._name}
93-
alias=${ifDefined(this._alias)}
94-
?auto-generate-alias=${this._isNew}
95-
?alias-readonly=${this._aliasCanBeChanged === false}
96-
@change=${this.#onNameAndAliasChange}
97-
${umbFocus()}>
98-
</umb-input-with-alias>
103+
<div id="editors">
104+
<umb-input-with-alias
105+
id="name"
106+
label=${this.localize.term('placeholders_entername')}
107+
.value=${this._name}
108+
alias=${ifDefined(this._alias)}
109+
?auto-generate-alias=${this._isNew}
110+
?alias-readonly=${this._aliasCanBeChanged === false}
111+
@change=${this.#onNameAndAliasChange}
112+
${umbFocus()}>
113+
</umb-input-with-alias>
114+
115+
<uui-input
116+
id="description"
117+
.label=${this.localize.term('placeholders_enterDescription')}
118+
.value=${this._description}
119+
.placeholder=${this.localize.term('placeholders_enterDescription')}
120+
@input=${this.#onDescriptionChange}></uui-input>
121+
</div>
99122
</div>
100123
`;
101124
}
@@ -127,6 +150,17 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement {
127150
flex: 1 1 auto;
128151
align-items: center;
129152
}
153+
154+
#editors {
155+
width: 100%;
156+
}
157+
158+
#description {
159+
width: 100%;
160+
margin-top: -1px;
161+
--uui-input-height: var(--uui-size-8);
162+
--uui-input-border-color: transparent;
163+
}
130164
`,
131165
];
132166
}

src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group/user-group-workspace.context.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export class UmbUserGroupWorkspaceContext
2929
readonly mediaRootAccess = this._data.createObservablePartOfCurrent((data) => data?.mediaRootAccess || false);
3030
readonly fallbackPermissions = this._data.createObservablePartOfCurrent((data) => data?.fallbackPermissions || []);
3131
readonly permissions = this._data.createObservablePartOfCurrent((data) => data?.permissions || []);
32+
readonly description = this._data.createObservablePartOfCurrent((data) => data?.description || '');
3233

3334
constructor(host: UmbControllerHost) {
3435
super(host, {
@@ -99,6 +100,15 @@ export class UmbUserGroupWorkspaceContext
99100
setFallbackPermissions(fallbackPermissions: Array<string>) {
100101
this._data.updateCurrent({ fallbackPermissions });
101102
}
103+
104+
/**
105+
* Sets the description
106+
* @param {string} description - The description
107+
* @memberof UmbUserGroupWorkspaceContext
108+
*/
109+
setDescription(description: string) {
110+
this._data.updateCurrent({ description });
111+
}
102112
}
103113

104114
export { UmbUserGroupWorkspaceContext as api };

0 commit comments

Comments
 (0)