@umbraco-cms/backoffice 14.0.0-40e04294 → 14.0.0-45828375
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cms/apps/app/app.element.js +0 -3
- package/dist-cms/assets/lang/da-dk.js +3 -0
- package/dist-cms/assets/lang/da-dk.ts +3 -0
- package/dist-cms/assets/lang/en-us.js +21 -18
- package/dist-cms/assets/lang/en-us.ts +21 -18
- package/dist-cms/custom-elements.json +149 -19
- package/dist-cms/mocks/browser-handlers.js +1 -1
- package/dist-cms/mocks/data/entity.data.d.ts +1 -1
- package/dist-cms/mocks/data/entity.data.js +1 -9
- package/dist-cms/mocks/data/media.data.d.ts +2 -1
- package/dist-cms/mocks/data/media.data.js +11 -0
- package/dist-cms/mocks/data/user-group.data.d.ts +17 -0
- package/dist-cms/mocks/data/user-group.data.js +61 -0
- package/dist-cms/mocks/data/user.data.d.ts +15 -0
- package/dist-cms/mocks/data/{users.data.js → user.data.js} +27 -41
- package/dist-cms/mocks/handlers/dictionary.handlers.js +2 -2
- package/dist-cms/mocks/handlers/media.handlers.js +8 -0
- package/dist-cms/mocks/handlers/partial-views.handlers.js +3 -3
- package/dist-cms/mocks/handlers/user-group/collection.handlers.d.ts +1 -0
- package/dist-cms/mocks/handlers/user-group/collection.handlers.js +10 -0
- package/dist-cms/mocks/handlers/user-group/detail.handlers.d.ts +1 -0
- package/dist-cms/mocks/handlers/user-group/detail.handlers.js +37 -0
- package/dist-cms/mocks/handlers/user-group/index.js +4 -0
- package/dist-cms/mocks/handlers/user-group/item.handlers.d.ts +1 -0
- package/dist-cms/mocks/handlers/user-group/item.handlers.js +13 -0
- package/dist-cms/mocks/handlers/user-group/slug.d.ts +1 -0
- package/dist-cms/mocks/handlers/user-group/slug.js +1 -0
- package/dist-cms/mocks/handlers/user.handlers.js +15 -1
- package/dist-cms/packages/core/components/input-list-base/input-list-base.js +1 -1
- package/dist-cms/packages/core/components/input-section/input-section.element.d.ts +2 -2
- package/dist-cms/packages/core/components/input-section/input-section.element.js +5 -5
- package/dist-cms/packages/core/extension-registry/conditions/types.d.ts +3 -2
- package/dist-cms/packages/core/extension-registry/models/index.d.ts +5 -1
- package/dist-cms/packages/core/extension-registry/models/index.js +2 -0
- package/dist-cms/packages/core/extension-registry/models/user-granular-permission.model.d.ts +8 -0
- package/dist-cms/packages/core/extension-registry/models/user-granular-permission.model.js +1 -0
- package/dist-cms/packages/core/extension-registry/models/user-permission.model.d.ts +11 -0
- package/dist-cms/packages/core/extension-registry/models/user-permission.model.js +1 -0
- package/dist-cms/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.d.ts +19 -0
- package/dist-cms/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.js +97 -0
- package/dist-cms/packages/core/modal/common/manifests.js +6 -0
- package/dist-cms/packages/core/modal/common/tree-picker/tree-picker-modal.element.js +5 -3
- package/dist-cms/packages/core/modal/token/entity-user-permission-settings-modal.token.d.ts +7 -0
- package/dist-cms/packages/core/modal/token/entity-user-permission-settings-modal.token.js +4 -0
- package/dist-cms/packages/core/modal/token/index.d.ts +1 -0
- package/dist-cms/packages/core/modal/token/index.js +1 -0
- package/dist-cms/packages/core/picker-input/picker-input.context.js +1 -3
- package/dist-cms/packages/core/tree/tree.context.js +3 -2
- package/dist-cms/packages/documents/documents/components/index.d.ts +1 -0
- package/dist-cms/packages/documents/documents/components/index.js +1 -0
- package/dist-cms/packages/documents/documents/components/input-document/input-document.context.d.ts +6 -0
- package/dist-cms/packages/documents/documents/components/input-document/input-document.context.js +7 -0
- package/dist-cms/packages/documents/documents/components/input-document/input-document.element.d.ts +7 -12
- package/dist-cms/packages/documents/documents/components/input-document/input-document.element.js +51 -64
- package/dist-cms/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.d.ts +23 -0
- package/dist-cms/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.js +102 -0
- package/dist-cms/packages/documents/documents/entity-actions/create/manifests.js +9 -0
- package/dist-cms/packages/documents/documents/entity-actions/manifests.js +1 -1
- package/dist-cms/packages/documents/documents/entity-actions/permissions.action.d.ts +2 -1
- package/dist-cms/packages/documents/documents/entity-actions/permissions.action.js +22 -2
- package/dist-cms/packages/documents/documents/index.d.ts +2 -0
- package/dist-cms/packages/documents/documents/index.js +2 -0
- package/dist-cms/packages/documents/documents/manifests.d.ts +4 -0
- package/dist-cms/packages/documents/documents/manifests.js +2 -0
- package/dist-cms/packages/documents/documents/recycle-bin/entity-action/manifests.d.ts +4 -0
- package/dist-cms/packages/documents/documents/recycle-bin/entity-action/manifests.js +6 -0
- package/dist-cms/packages/documents/documents/recycle-bin/manifests.d.ts +4 -0
- package/dist-cms/packages/documents/documents/repository/document.repository.js +4 -4
- package/dist-cms/packages/documents/documents/repository/manifests.d.ts +3 -2
- package/dist-cms/packages/documents/documents/repository/manifests.js +9 -1
- package/dist-cms/packages/documents/documents/user-permissions/index.d.ts +1 -0
- package/dist-cms/packages/documents/documents/user-permissions/index.js +1 -0
- package/dist-cms/packages/documents/documents/user-permissions/manifests.d.ts +19 -0
- package/dist-cms/packages/documents/documents/user-permissions/manifests.js +196 -0
- package/dist-cms/packages/documents/manifests.d.ts +4 -0
- package/dist-cms/packages/media/manifests.d.ts +2 -1
- package/dist-cms/packages/media/manifests.js +1 -0
- package/dist-cms/packages/media/media/components/index.d.ts +1 -0
- package/dist-cms/packages/media/media/components/index.js +1 -0
- package/dist-cms/packages/media/media/components/input-media/input-media.context.d.ts +6 -0
- package/dist-cms/packages/media/media/components/input-media/input-media.context.js +7 -0
- package/dist-cms/packages/media/media/components/input-media/input-media.element.d.ts +7 -15
- package/dist-cms/packages/media/media/components/input-media/input-media.element.js +50 -72
- package/dist-cms/packages/media/media/index.d.ts +2 -0
- package/dist-cms/packages/media/media/index.js +1 -1
- package/dist-cms/packages/media/media/manifests.d.ts +1 -1
- package/dist-cms/packages/media/media/manifests.js +2 -0
- package/dist-cms/packages/media/media/repository/manifests.d.ts +3 -2
- package/dist-cms/packages/media/media/repository/manifests.js +9 -1
- package/dist-cms/packages/media/media/repository/media-item.store.d.ts +20 -0
- package/dist-cms/packages/media/media/repository/media-item.store.js +23 -0
- package/dist-cms/packages/media/media/repository/media.repository.d.ts +6 -0
- package/dist-cms/packages/media/media/repository/media.repository.js +22 -0
- package/dist-cms/packages/media/media/repository/sources/media-item.server.data.d.ts +24 -0
- package/dist-cms/packages/media/media/repository/sources/media-item.server.data.js +31 -0
- package/dist-cms/packages/media/media/user-permissions/index.d.ts +1 -0
- package/dist-cms/packages/media/media/user-permissions/index.js +1 -0
- package/dist-cms/packages/media/media/user-permissions/manifests.d.ts +4 -0
- package/dist-cms/packages/media/media/user-permissions/manifests.js +27 -0
- package/dist-cms/packages/users/current-user/conditions/index.d.ts +1 -0
- package/dist-cms/packages/users/current-user/conditions/index.js +1 -0
- package/dist-cms/packages/users/current-user/conditions/user-permission.condition.d.ts +18 -0
- package/dist-cms/packages/users/current-user/conditions/user-permission.condition.js +23 -0
- package/dist-cms/packages/users/current-user/index.d.ts +1 -0
- package/dist-cms/packages/users/current-user/index.js +1 -0
- package/dist-cms/packages/users/current-user/manifests.js +7 -1
- package/dist-cms/packages/users/current-user/modals/current-user/current-user-modal.element.js +7 -7
- package/dist-cms/packages/users/index.d.ts +4 -2
- package/dist-cms/packages/users/index.js +4 -2
- package/dist-cms/packages/users/manifests.d.ts +2 -0
- package/dist-cms/packages/users/manifests.js +3 -0
- package/dist-cms/packages/users/user-groups/collection/user-group-collection-header.element.js +2 -2
- package/dist-cms/packages/users/user-groups/collection/user-group-collection-view.element.js +6 -6
- package/dist-cms/packages/users/user-groups/components/index.d.ts +1 -0
- package/dist-cms/packages/users/user-groups/components/index.js +1 -0
- package/dist-cms/packages/users/user-groups/entity-actions/manifests.d.ts +2 -0
- package/dist-cms/packages/users/user-groups/entity-actions/manifests.js +19 -0
- package/dist-cms/packages/users/user-groups/index.d.ts +2 -0
- package/dist-cms/packages/users/user-groups/index.js +2 -0
- package/dist-cms/packages/users/user-groups/manifests.d.ts +1 -1
- package/dist-cms/packages/users/user-groups/manifests.js +2 -0
- package/dist-cms/packages/users/user-groups/workspace/components/user-group-default-permission-list.element.d.ts +16 -0
- package/dist-cms/packages/users/user-groups/workspace/components/user-group-default-permission-list.element.js +69 -0
- package/dist-cms/packages/users/user-groups/workspace/components/user-group-granular-permission-list.element.d.ts +14 -0
- package/dist-cms/packages/users/user-groups/workspace/components/user-group-granular-permission-list.element.js +31 -0
- package/dist-cms/packages/users/user-groups/workspace/user-group-workspace-editor.element.d.ts +2 -0
- package/dist-cms/packages/users/user-groups/workspace/user-group-workspace-editor.element.js +57 -56
- package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.context.d.ts +12 -0
- package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.context.js +20 -0
- package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.element.js +1 -1
- package/dist-cms/packages/users/users/collection/user-collection-header.element.js +18 -11
- package/dist-cms/packages/users/users/collection/views/grid/user-collection-grid-view.element.js +6 -6
- package/dist-cms/packages/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.js +3 -3
- package/dist-cms/packages/users/users/components/index.d.ts +3 -0
- package/dist-cms/packages/users/users/components/index.js +3 -0
- package/dist-cms/packages/users/users/components/user-input/user-input.element.js +2 -2
- package/dist-cms/packages/users/users/components/user-permission-setting/user-permission-setting.element.d.ts +15 -0
- package/dist-cms/packages/users/users/components/user-permission-setting/user-permission-setting.element.js +66 -0
- package/dist-cms/packages/users/users/index.d.ts +2 -0
- package/dist-cms/packages/users/users/index.js +2 -0
- package/dist-cms/packages/users/users/modals/user-picker/user-picker-modal.element.d.ts +3 -1
- package/dist-cms/packages/users/users/modals/user-picker/user-picker-modal.element.js +20 -25
- package/dist-cms/packages/users/users/repository/index.d.ts +1 -0
- package/dist-cms/packages/users/users/repository/index.js +1 -0
- package/dist-cms/packages/users/users/repository/user.repository.js +1 -1
- package/dist-cms/packages/users/users/workspace/user-workspace-editor.element.js +73 -56
- package/dist-cms/packages/users/utils.d.ts +5 -2
- package/dist-cms/packages/users/utils.js +14 -14
- package/dist-cms/shared/auth/auth-flow.d.ts +0 -4
- package/dist-cms/shared/auth/auth-flow.js +6 -25
- package/dist-cms/shared/repository/repository-items.manager.js +5 -0
- package/dist-cms/shared/umb-events/index.d.ts +1 -0
- package/dist-cms/shared/umb-events/index.js +1 -0
- package/dist-cms/shared/umb-events/selected.event.d.ts +3 -0
- package/dist-cms/shared/umb-events/selected.event.js +6 -0
- package/dist-cms/tsconfig.build.tsbuildinfo +1 -1
- package/dist-cms/umbraco-package-schema.json +154 -0
- package/dist-cms/vscode-html-custom-data.json +66 -18
- package/package.json +1 -1
- package/dist-cms/mocks/data/user-groups.data.d.ts +0 -9
- package/dist-cms/mocks/data/user-groups.data.js +0 -21
- package/dist-cms/mocks/data/users.data.d.ts +0 -16
- package/dist-cms/mocks/handlers/user-group.handlers.js +0 -17
- /package/dist-cms/mocks/handlers/{user-group.handlers.d.ts → user-group/index.d.ts} +0 -0
|
@@ -4,7 +4,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import {
|
|
7
|
+
import { getDisplayStateFromUserStatus } from '../../utils.js';
|
|
8
|
+
import { UmbUserRepository } from '../index.js';
|
|
8
9
|
import { UUIInputEvent } from '../../../../external/uui/index.js';
|
|
9
10
|
import { css, html, nothing, customElement, state, ifDefined, repeat, } from '../../../../external/lit/index.js';
|
|
10
11
|
import { firstValueFrom } from '../../../../external/rxjs/index.js';
|
|
@@ -12,9 +13,7 @@ import { UMB_CHANGE_PASSWORD_MODAL } from '../../../core/modal/index.js';
|
|
|
12
13
|
import { UmbLitElement } from '../../../../shared/lit-element/index.js';
|
|
13
14
|
import { UMB_WORKSPACE_CONTEXT } from '../../../core/workspace/index.js';
|
|
14
15
|
import { UserStateModel } from '../../../../external/backend-api/index.js';
|
|
15
|
-
import { createExtensionClass } from '../../../../libs/extension-api/index.js';
|
|
16
16
|
import { umbExtensionsRegistry } from '../../../core/extension-registry/index.js';
|
|
17
|
-
import { UmbObserverController } from '../../../../libs/observable-api/index.js';
|
|
18
17
|
import { UMB_AUTH } from '../../../../shared/auth/index.js';
|
|
19
18
|
import { UmbTextStyles } from '../../../../shared/style/index.js';
|
|
20
19
|
export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement extends UmbLitElement {
|
|
@@ -25,6 +24,7 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
|
|
|
25
24
|
constructor() {
|
|
26
25
|
super();
|
|
27
26
|
this.languages = [];
|
|
27
|
+
this.#userRepository = new UmbUserRepository(this);
|
|
28
28
|
this.consumeContext(UMB_AUTH, (instance) => {
|
|
29
29
|
this.#auth = instance;
|
|
30
30
|
this.#observeCurrentUser();
|
|
@@ -33,18 +33,6 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
|
|
|
33
33
|
this.#workspaceContext = workspaceContext;
|
|
34
34
|
this.#observeUser();
|
|
35
35
|
});
|
|
36
|
-
// TODO: this code is reused in multiple places, so it should be extracted to a function
|
|
37
|
-
new UmbObserverController(this, umbExtensionsRegistry.getByTypeAndAlias('repository', 'Umb.Repository.User'), async (repositoryManifest) => {
|
|
38
|
-
if (!repositoryManifest)
|
|
39
|
-
return;
|
|
40
|
-
try {
|
|
41
|
-
const result = await createExtensionClass(repositoryManifest, [this]);
|
|
42
|
-
this.#userRepository = result;
|
|
43
|
-
}
|
|
44
|
-
catch (error) {
|
|
45
|
-
throw new Error('Could not create repository with alias: Umb.Repository.User');
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
36
|
}
|
|
49
37
|
#observeUser() {
|
|
50
38
|
if (!this.#workspaceContext)
|
|
@@ -152,52 +140,63 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
|
|
|
152
140
|
return nothing;
|
|
153
141
|
return html ` <uui-box>
|
|
154
142
|
<div slot="headline"><umb-localize key="user_profile">Profile</umb-localize></div>
|
|
155
|
-
<umb-workspace-property-layout label="
|
|
156
|
-
<uui-input
|
|
143
|
+
<umb-workspace-property-layout label="${this.localize.term('general_email')}">
|
|
144
|
+
<uui-input
|
|
145
|
+
slot="editor"
|
|
146
|
+
name="email"
|
|
147
|
+
label="${this.localize.term('general_email')}"
|
|
148
|
+
readonly
|
|
149
|
+
value=${ifDefined(this._user.email)}></uui-input>
|
|
157
150
|
</umb-workspace-property-layout>
|
|
158
|
-
<umb-workspace-property-layout
|
|
151
|
+
<umb-workspace-property-layout
|
|
152
|
+
label="${this.localize.term('user_language')}"
|
|
153
|
+
description=${this.localize.term('user_languageHelp')}>
|
|
159
154
|
<uui-select
|
|
160
155
|
slot="editor"
|
|
161
156
|
name="language"
|
|
162
|
-
label="
|
|
157
|
+
label="${this.localize.term('user_language')}"
|
|
163
158
|
.options=${this.languages}
|
|
164
159
|
@change="${this.#onLanguageChange}">
|
|
165
160
|
</uui-select>
|
|
166
161
|
</umb-workspace-property-layout>
|
|
167
162
|
</uui-box>
|
|
168
163
|
<uui-box>
|
|
169
|
-
<div slot="headline">Assign
|
|
164
|
+
<div slot="headline"><umb-localize key="user_assignAccess">Assign Access</umb-localize></div>
|
|
170
165
|
<div id="assign-access">
|
|
171
|
-
<umb-workspace-property-layout
|
|
166
|
+
<umb-workspace-property-layout
|
|
167
|
+
label="${this.localize.term('general_groups')}"
|
|
168
|
+
description="${this.localize.term('user_groupsHelp')}">
|
|
172
169
|
<umb-user-group-input
|
|
173
170
|
slot="editor"
|
|
174
171
|
.selectedIds=${this._user.userGroupIds ?? []}
|
|
175
172
|
@change=${(e) => this.#onUserGroupsChange(e.target.selectedIds)}></umb-user-group-input>
|
|
176
173
|
</umb-workspace-property-layout>
|
|
177
174
|
<umb-workspace-property-layout
|
|
178
|
-
label
|
|
179
|
-
description
|
|
175
|
+
label=${this.localize.term('user_startnodes')}
|
|
176
|
+
description=${this.localize.term('user_startnodeshelp')}>
|
|
180
177
|
<umb-property-editor-ui-document-picker
|
|
181
178
|
.value=${this._user.contentStartNodeIds ?? []}
|
|
182
179
|
@property-value-change=${(e) => this.#workspaceContext?.updateProperty('contentStartNodeIds', e.target.value)}
|
|
183
180
|
slot="editor"></umb-property-editor-ui-document-picker>
|
|
184
181
|
</umb-workspace-property-layout>
|
|
185
182
|
<umb-workspace-property-layout
|
|
186
|
-
label
|
|
187
|
-
description
|
|
183
|
+
label=${this.localize.term('user_mediastartnodes')}
|
|
184
|
+
description=${this.localize.term('user_mediastartnodeshelp')}>
|
|
188
185
|
<b slot="editor">NEED MEDIA PICKER</b>
|
|
189
186
|
</umb-workspace-property-layout>
|
|
190
187
|
</div>
|
|
191
188
|
</uui-box>
|
|
192
|
-
<uui-box headline
|
|
189
|
+
<uui-box headline=${this.localize.term('user_access')}>
|
|
193
190
|
<div slot="header" class="faded-text">
|
|
194
|
-
|
|
191
|
+
<umb-localize key="user_accessHelp"
|
|
192
|
+
>Based on the assigned groups and start nodes, the user has access to the following nodes</umb-localize
|
|
193
|
+
>
|
|
195
194
|
</div>
|
|
196
195
|
|
|
197
|
-
<b>Content</b>
|
|
196
|
+
<b><umb-localize key="sections_content">Content</umb-localize></b>
|
|
198
197
|
${this.#renderContentStartNodes()}
|
|
199
198
|
<hr />
|
|
200
|
-
<b>Media</b>
|
|
199
|
+
<b><umb-localize key="sections_media">Media</umb-localize></b>
|
|
201
200
|
<uui-ref-node name="Media Root">
|
|
202
201
|
<uui-icon slot="icon" name="folder"></uui-icon>
|
|
203
202
|
</uui-ref-node>
|
|
@@ -206,41 +205,42 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
|
|
|
206
205
|
#renderRightColumn() {
|
|
207
206
|
if (!this._user || !this.#workspaceContext)
|
|
208
207
|
return nothing;
|
|
209
|
-
const
|
|
208
|
+
const displayState = getDisplayStateFromUserStatus(this._user.state);
|
|
210
209
|
return html ` <uui-box>
|
|
211
210
|
<div id="user-info">
|
|
212
211
|
<uui-avatar .name=${this._user?.name || ''}></uui-avatar>
|
|
213
|
-
<uui-button label
|
|
212
|
+
<uui-button label=${this.localize.term('user_changePhoto')}></uui-button>
|
|
214
213
|
<hr />
|
|
215
214
|
${this.#renderActionButtons()}
|
|
216
215
|
|
|
217
216
|
<div>
|
|
218
|
-
<b>Status
|
|
219
|
-
<uui-tag look="${ifDefined(
|
|
220
|
-
${this.
|
|
217
|
+
<b><umb-localize key="general_status">Status</umb-localize>:</b>
|
|
218
|
+
<uui-tag look="${ifDefined(displayState?.look)}" color="${ifDefined(displayState?.color)}">
|
|
219
|
+
${this.localize.term('user_' + displayState.key)}
|
|
221
220
|
</uui-tag>
|
|
222
221
|
</div>
|
|
223
222
|
|
|
224
223
|
${this._user?.state === UserStateModel.INVITED
|
|
225
224
|
? html `
|
|
226
|
-
<uui-textarea placeholder
|
|
227
|
-
<uui-button look="primary" label
|
|
225
|
+
<uui-textarea placeholder=${this.localize.term('placeholders_enterMessage')}></uui-textarea>
|
|
226
|
+
<uui-button look="primary" label=${this.localize.term('actions_resendInvite')}></uui-button>
|
|
228
227
|
`
|
|
229
228
|
: nothing}
|
|
230
|
-
${this.#renderInfoItem('
|
|
231
|
-
|
|
232
|
-
${this.#renderInfoItem('
|
|
233
|
-
${this.#renderInfoItem('
|
|
234
|
-
${this.#renderInfoItem('
|
|
235
|
-
${this.#renderInfoItem('
|
|
236
|
-
${this.#renderInfoItem('
|
|
229
|
+
${this.#renderInfoItem('user_lastLogin', this.localize.date(this._user.lastLoginDate) ||
|
|
230
|
+
`${this._user.name + ' ' + this.localize.term('user_noLogin')} `)}
|
|
231
|
+
${this.#renderInfoItem('user_failedPasswordAttempts', this._user.failedLoginAttempts)}
|
|
232
|
+
${this.#renderInfoItem('user_lastLockoutDate', this._user.lastLockoutDate || `${this._user.name + ' ' + this.localize.term('user_noLockouts')}`)}
|
|
233
|
+
${this.#renderInfoItem('user_lastPasswordChangeDate', this._user.lastLoginDate || `${this._user.name + ' ' + this.localize.term('user_noPasswordChange')}`)}
|
|
234
|
+
${this.#renderInfoItem('user_createDate', this.localize.date(this._user.createDate))}
|
|
235
|
+
${this.#renderInfoItem('user_updateDate', this.localize.date(this._user.updateDate))}
|
|
236
|
+
${this.#renderInfoItem('general_id', this._user.id)}
|
|
237
237
|
</div>
|
|
238
238
|
</uui-box>`;
|
|
239
239
|
}
|
|
240
|
-
#renderInfoItem(
|
|
240
|
+
#renderInfoItem(labelkey, value) {
|
|
241
241
|
return html `
|
|
242
242
|
<div>
|
|
243
|
-
<b
|
|
243
|
+
<b><umb-localize key=${labelkey}></umb-localize></b>
|
|
244
244
|
<span>${value}</span>
|
|
245
245
|
</div>
|
|
246
246
|
`;
|
|
@@ -251,23 +251,40 @@ export let UmbUserWorkspaceEditorElement = class UmbUserWorkspaceEditorElement e
|
|
|
251
251
|
//TODO: Find out if the current user is an admin. If not, show no buttons.
|
|
252
252
|
// if (this._currentUserStore?.isAdmin === false) return nothing;
|
|
253
253
|
const buttons = [];
|
|
254
|
-
if (this._user.
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
254
|
+
if (this._user.id !== this._currentUser?.id) {
|
|
255
|
+
if (this._user.state === UserStateModel.DISABLED) {
|
|
256
|
+
buttons.push(html `
|
|
257
|
+
<uui-button
|
|
258
|
+
@click=${this.#onUserStatusChange}
|
|
259
|
+
look="secondary"
|
|
260
|
+
color="positive"
|
|
261
|
+
label=${this.localize.term('actions_enable')}></uui-button>
|
|
262
|
+
`);
|
|
263
|
+
}
|
|
264
|
+
if (this._user.state === UserStateModel.ACTIVE || this._user.state === UserStateModel.INACTIVE) {
|
|
265
|
+
buttons.push(html `
|
|
266
|
+
<uui-button
|
|
267
|
+
@click=${this.#onUserStatusChange}
|
|
268
|
+
look="secondary"
|
|
269
|
+
color="warning"
|
|
270
|
+
label=${this.localize.term('actions_disable')}></uui-button>
|
|
271
|
+
`);
|
|
272
|
+
}
|
|
263
273
|
}
|
|
264
274
|
if (this._currentUser?.id !== this._user?.id) {
|
|
265
275
|
const button = html `
|
|
266
|
-
<uui-button
|
|
276
|
+
<uui-button
|
|
277
|
+
@click=${this.#onUserDelete}
|
|
278
|
+
look="secondary"
|
|
279
|
+
color="danger"
|
|
280
|
+
label=${this.localize.term('user_deleteUser')}></uui-button>
|
|
267
281
|
`;
|
|
268
282
|
buttons.push(button);
|
|
269
283
|
}
|
|
270
|
-
buttons.push(html `<uui-button
|
|
284
|
+
buttons.push(html `<uui-button
|
|
285
|
+
@click=${this.#onPasswordChange}
|
|
286
|
+
look="secondary"
|
|
287
|
+
label=${this.localize.term('general_changePassword')}></uui-button>`);
|
|
271
288
|
return buttons;
|
|
272
289
|
}
|
|
273
290
|
#renderContentStartNodes() {
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { InterfaceColor, InterfaceLook } from '../../external/uui/index.js';
|
|
2
2
|
import { UserStateModel } from '../../external/backend-api/index.js';
|
|
3
|
-
|
|
3
|
+
interface DisplayStatus {
|
|
4
4
|
look: InterfaceLook;
|
|
5
5
|
color: InterfaceColor;
|
|
6
|
-
|
|
6
|
+
key: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const getDisplayStateFromUserStatus: (status?: UserStateModel) => DisplayStatus;
|
|
9
|
+
export {};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
1
|
+
const userStates = [
|
|
2
|
+
{ "key": "All", color: "positive", look: "secondary" },
|
|
3
|
+
{ "key": "Active", "color": "positive", look: "primary" },
|
|
4
|
+
{ "key": "Disabled", "color": "danger", look: "primary" },
|
|
5
|
+
{ "key": "LockedOut", "color": "danger", look: "secondary" },
|
|
6
|
+
{ "key": "Invited", "color": "warning", look: "primary" },
|
|
7
|
+
{ "key": "Inactive", "color": "warning", look: "primary" }
|
|
8
|
+
];
|
|
9
|
+
export const getDisplayStateFromUserStatus = (status) => userStates
|
|
10
|
+
.filter(state => state.key === status)
|
|
11
|
+
.map(state => ({
|
|
12
|
+
...state,
|
|
13
|
+
key: 'state' + state.key
|
|
14
|
+
}))[0];
|
|
@@ -59,10 +59,6 @@ export declare class UmbAuthFlow {
|
|
|
59
59
|
* saved the state in local storage before redirecting the user to the login page.
|
|
60
60
|
*/
|
|
61
61
|
completeAuthorizationIfPossible(): Promise<void>;
|
|
62
|
-
/**
|
|
63
|
-
* This method will query the server for the service configuration usually found at /.well-known/openid-configuration.
|
|
64
|
-
*/
|
|
65
|
-
fetchServiceConfiguration(): Promise<void>;
|
|
66
62
|
/**
|
|
67
63
|
* This method will make an authorization request to the server.
|
|
68
64
|
*
|
|
@@ -69,7 +69,6 @@ export class UmbAuthFlow {
|
|
|
69
69
|
#storageBackend;
|
|
70
70
|
// state
|
|
71
71
|
#configuration;
|
|
72
|
-
#openIdConnectUrl;
|
|
73
72
|
#redirectUri;
|
|
74
73
|
#clientId;
|
|
75
74
|
#scope;
|
|
@@ -77,10 +76,15 @@ export class UmbAuthFlow {
|
|
|
77
76
|
#refreshToken;
|
|
78
77
|
#accessTokenResponse;
|
|
79
78
|
constructor(openIdConnectUrl, redirectUri, clientId = 'umbraco-back-office', scope = 'offline_access') {
|
|
80
|
-
this.#openIdConnectUrl = openIdConnectUrl;
|
|
81
79
|
this.#redirectUri = redirectUri;
|
|
82
80
|
this.#clientId = clientId;
|
|
83
81
|
this.#scope = scope;
|
|
82
|
+
this.#configuration = new AuthorizationServiceConfiguration({
|
|
83
|
+
authorization_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/authorize`,
|
|
84
|
+
token_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/token`,
|
|
85
|
+
revocation_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/revoke`,
|
|
86
|
+
end_session_endpoint: `${openIdConnectUrl}/umbraco/management/api/v1/security/back-office/signout`,
|
|
87
|
+
});
|
|
84
88
|
this.#notifier = new AuthorizationNotifier();
|
|
85
89
|
this.#tokenHandler = new BaseTokenRequestHandler(requestor);
|
|
86
90
|
this.#storageBackend = new LocalStorageBackend();
|
|
@@ -118,10 +122,6 @@ export class UmbAuthFlow {
|
|
|
118
122
|
* - If there is no new authorization to be made, do nothing
|
|
119
123
|
*/
|
|
120
124
|
async setInitialState() {
|
|
121
|
-
// Ensure there is a connection to the server
|
|
122
|
-
if (!this.#configuration) {
|
|
123
|
-
await this.fetchServiceConfiguration();
|
|
124
|
-
}
|
|
125
125
|
const tokenResponseJson = await this.#storageBackend.getItem(TOKEN_RESPONSE_NAME);
|
|
126
126
|
if (tokenResponseJson) {
|
|
127
127
|
const response = new TokenResponse(JSON.parse(tokenResponseJson));
|
|
@@ -142,23 +142,12 @@ export class UmbAuthFlow {
|
|
|
142
142
|
completeAuthorizationIfPossible() {
|
|
143
143
|
return this.#authorizationHandler.completeAuthorizationRequestIfPossible();
|
|
144
144
|
}
|
|
145
|
-
/**
|
|
146
|
-
* This method will query the server for the service configuration usually found at /.well-known/openid-configuration.
|
|
147
|
-
*/
|
|
148
|
-
async fetchServiceConfiguration() {
|
|
149
|
-
const response = await AuthorizationServiceConfiguration.fetchFromIssuer(this.#openIdConnectUrl, requestor);
|
|
150
|
-
this.#configuration = response;
|
|
151
|
-
}
|
|
152
145
|
/**
|
|
153
146
|
* This method will make an authorization request to the server.
|
|
154
147
|
*
|
|
155
148
|
* @param username The username to use for the authorization request. It will be provided to the OpenID server as a hint.
|
|
156
149
|
*/
|
|
157
150
|
makeAuthorizationRequest(username) {
|
|
158
|
-
if (!this.#configuration) {
|
|
159
|
-
console.log('Unknown service configuration');
|
|
160
|
-
throw new Error('Unknown service configuration');
|
|
161
|
-
}
|
|
162
151
|
const extras = { prompt: 'consent', access_type: 'offline' };
|
|
163
152
|
if (username) {
|
|
164
153
|
extras['login_hint'] = username;
|
|
@@ -199,10 +188,6 @@ export class UmbAuthFlow {
|
|
|
199
188
|
* @returns The access token for the user.
|
|
200
189
|
*/
|
|
201
190
|
async performWithFreshTokens() {
|
|
202
|
-
if (!this.#configuration) {
|
|
203
|
-
console.log('Unknown service configuration');
|
|
204
|
-
return Promise.reject('Unknown service configuration');
|
|
205
|
-
}
|
|
206
191
|
if (!this.#refreshToken) {
|
|
207
192
|
console.log('Missing refreshToken.');
|
|
208
193
|
return Promise.resolve('Missing refreshToken.');
|
|
@@ -235,10 +220,6 @@ export class UmbAuthFlow {
|
|
|
235
220
|
* This method will make a token request to the server using the authorization code.
|
|
236
221
|
*/
|
|
237
222
|
async #makeRefreshTokenRequest(code, codeVerifier) {
|
|
238
|
-
if (!this.#configuration) {
|
|
239
|
-
console.log('Unknown service configuration');
|
|
240
|
-
return Promise.reject();
|
|
241
|
-
}
|
|
242
223
|
const extras = {};
|
|
243
224
|
if (codeVerifier) {
|
|
244
225
|
extras.code_verifier = codeVerifier;
|
|
@@ -29,6 +29,11 @@ export class UmbRepositoryItemsManager {
|
|
|
29
29
|
setUniques(uniques) {
|
|
30
30
|
this.#uniques.next(uniques);
|
|
31
31
|
//TODO: Check if it's safe to call requestItems here.
|
|
32
|
+
// We don't have to request items if there is no uniques.
|
|
33
|
+
if (uniques.length === 0) {
|
|
34
|
+
this.#items.next([]);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
32
37
|
this.#requestItems();
|
|
33
38
|
}
|
|
34
39
|
getItems() {
|