@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.
Files changed (164) hide show
  1. package/dist-cms/apps/app/app.element.js +0 -3
  2. package/dist-cms/assets/lang/da-dk.js +3 -0
  3. package/dist-cms/assets/lang/da-dk.ts +3 -0
  4. package/dist-cms/assets/lang/en-us.js +21 -18
  5. package/dist-cms/assets/lang/en-us.ts +21 -18
  6. package/dist-cms/custom-elements.json +149 -19
  7. package/dist-cms/mocks/browser-handlers.js +1 -1
  8. package/dist-cms/mocks/data/entity.data.d.ts +1 -1
  9. package/dist-cms/mocks/data/entity.data.js +1 -9
  10. package/dist-cms/mocks/data/media.data.d.ts +2 -1
  11. package/dist-cms/mocks/data/media.data.js +11 -0
  12. package/dist-cms/mocks/data/user-group.data.d.ts +17 -0
  13. package/dist-cms/mocks/data/user-group.data.js +61 -0
  14. package/dist-cms/mocks/data/user.data.d.ts +15 -0
  15. package/dist-cms/mocks/data/{users.data.js → user.data.js} +27 -41
  16. package/dist-cms/mocks/handlers/dictionary.handlers.js +2 -2
  17. package/dist-cms/mocks/handlers/media.handlers.js +8 -0
  18. package/dist-cms/mocks/handlers/partial-views.handlers.js +3 -3
  19. package/dist-cms/mocks/handlers/user-group/collection.handlers.d.ts +1 -0
  20. package/dist-cms/mocks/handlers/user-group/collection.handlers.js +10 -0
  21. package/dist-cms/mocks/handlers/user-group/detail.handlers.d.ts +1 -0
  22. package/dist-cms/mocks/handlers/user-group/detail.handlers.js +37 -0
  23. package/dist-cms/mocks/handlers/user-group/index.js +4 -0
  24. package/dist-cms/mocks/handlers/user-group/item.handlers.d.ts +1 -0
  25. package/dist-cms/mocks/handlers/user-group/item.handlers.js +13 -0
  26. package/dist-cms/mocks/handlers/user-group/slug.d.ts +1 -0
  27. package/dist-cms/mocks/handlers/user-group/slug.js +1 -0
  28. package/dist-cms/mocks/handlers/user.handlers.js +15 -1
  29. package/dist-cms/packages/core/components/input-list-base/input-list-base.js +1 -1
  30. package/dist-cms/packages/core/components/input-section/input-section.element.d.ts +2 -2
  31. package/dist-cms/packages/core/components/input-section/input-section.element.js +5 -5
  32. package/dist-cms/packages/core/extension-registry/conditions/types.d.ts +3 -2
  33. package/dist-cms/packages/core/extension-registry/models/index.d.ts +5 -1
  34. package/dist-cms/packages/core/extension-registry/models/index.js +2 -0
  35. package/dist-cms/packages/core/extension-registry/models/user-granular-permission.model.d.ts +8 -0
  36. package/dist-cms/packages/core/extension-registry/models/user-granular-permission.model.js +1 -0
  37. package/dist-cms/packages/core/extension-registry/models/user-permission.model.d.ts +11 -0
  38. package/dist-cms/packages/core/extension-registry/models/user-permission.model.js +1 -0
  39. package/dist-cms/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.d.ts +19 -0
  40. package/dist-cms/packages/core/modal/common/entity-user-permission-settings/entity-user-permission-settings-modal.element.js +97 -0
  41. package/dist-cms/packages/core/modal/common/manifests.js +6 -0
  42. package/dist-cms/packages/core/modal/common/tree-picker/tree-picker-modal.element.js +5 -3
  43. package/dist-cms/packages/core/modal/token/entity-user-permission-settings-modal.token.d.ts +7 -0
  44. package/dist-cms/packages/core/modal/token/entity-user-permission-settings-modal.token.js +4 -0
  45. package/dist-cms/packages/core/modal/token/index.d.ts +1 -0
  46. package/dist-cms/packages/core/modal/token/index.js +1 -0
  47. package/dist-cms/packages/core/picker-input/picker-input.context.js +1 -3
  48. package/dist-cms/packages/core/tree/tree.context.js +3 -2
  49. package/dist-cms/packages/documents/documents/components/index.d.ts +1 -0
  50. package/dist-cms/packages/documents/documents/components/index.js +1 -0
  51. package/dist-cms/packages/documents/documents/components/input-document/input-document.context.d.ts +6 -0
  52. package/dist-cms/packages/documents/documents/components/input-document/input-document.context.js +7 -0
  53. package/dist-cms/packages/documents/documents/components/input-document/input-document.element.d.ts +7 -12
  54. package/dist-cms/packages/documents/documents/components/input-document/input-document.element.js +51 -64
  55. package/dist-cms/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.d.ts +23 -0
  56. package/dist-cms/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.js +102 -0
  57. package/dist-cms/packages/documents/documents/entity-actions/create/manifests.js +9 -0
  58. package/dist-cms/packages/documents/documents/entity-actions/manifests.js +1 -1
  59. package/dist-cms/packages/documents/documents/entity-actions/permissions.action.d.ts +2 -1
  60. package/dist-cms/packages/documents/documents/entity-actions/permissions.action.js +22 -2
  61. package/dist-cms/packages/documents/documents/index.d.ts +2 -0
  62. package/dist-cms/packages/documents/documents/index.js +2 -0
  63. package/dist-cms/packages/documents/documents/manifests.d.ts +4 -0
  64. package/dist-cms/packages/documents/documents/manifests.js +2 -0
  65. package/dist-cms/packages/documents/documents/recycle-bin/entity-action/manifests.d.ts +4 -0
  66. package/dist-cms/packages/documents/documents/recycle-bin/entity-action/manifests.js +6 -0
  67. package/dist-cms/packages/documents/documents/recycle-bin/manifests.d.ts +4 -0
  68. package/dist-cms/packages/documents/documents/repository/document.repository.js +4 -4
  69. package/dist-cms/packages/documents/documents/repository/manifests.d.ts +3 -2
  70. package/dist-cms/packages/documents/documents/repository/manifests.js +9 -1
  71. package/dist-cms/packages/documents/documents/user-permissions/index.d.ts +1 -0
  72. package/dist-cms/packages/documents/documents/user-permissions/index.js +1 -0
  73. package/dist-cms/packages/documents/documents/user-permissions/manifests.d.ts +19 -0
  74. package/dist-cms/packages/documents/documents/user-permissions/manifests.js +196 -0
  75. package/dist-cms/packages/documents/manifests.d.ts +4 -0
  76. package/dist-cms/packages/media/manifests.d.ts +2 -1
  77. package/dist-cms/packages/media/manifests.js +1 -0
  78. package/dist-cms/packages/media/media/components/index.d.ts +1 -0
  79. package/dist-cms/packages/media/media/components/index.js +1 -0
  80. package/dist-cms/packages/media/media/components/input-media/input-media.context.d.ts +6 -0
  81. package/dist-cms/packages/media/media/components/input-media/input-media.context.js +7 -0
  82. package/dist-cms/packages/media/media/components/input-media/input-media.element.d.ts +7 -15
  83. package/dist-cms/packages/media/media/components/input-media/input-media.element.js +50 -72
  84. package/dist-cms/packages/media/media/index.d.ts +2 -0
  85. package/dist-cms/packages/media/media/index.js +1 -1
  86. package/dist-cms/packages/media/media/manifests.d.ts +1 -1
  87. package/dist-cms/packages/media/media/manifests.js +2 -0
  88. package/dist-cms/packages/media/media/repository/manifests.d.ts +3 -2
  89. package/dist-cms/packages/media/media/repository/manifests.js +9 -1
  90. package/dist-cms/packages/media/media/repository/media-item.store.d.ts +20 -0
  91. package/dist-cms/packages/media/media/repository/media-item.store.js +23 -0
  92. package/dist-cms/packages/media/media/repository/media.repository.d.ts +6 -0
  93. package/dist-cms/packages/media/media/repository/media.repository.js +22 -0
  94. package/dist-cms/packages/media/media/repository/sources/media-item.server.data.d.ts +24 -0
  95. package/dist-cms/packages/media/media/repository/sources/media-item.server.data.js +31 -0
  96. package/dist-cms/packages/media/media/user-permissions/index.d.ts +1 -0
  97. package/dist-cms/packages/media/media/user-permissions/index.js +1 -0
  98. package/dist-cms/packages/media/media/user-permissions/manifests.d.ts +4 -0
  99. package/dist-cms/packages/media/media/user-permissions/manifests.js +27 -0
  100. package/dist-cms/packages/users/current-user/conditions/index.d.ts +1 -0
  101. package/dist-cms/packages/users/current-user/conditions/index.js +1 -0
  102. package/dist-cms/packages/users/current-user/conditions/user-permission.condition.d.ts +18 -0
  103. package/dist-cms/packages/users/current-user/conditions/user-permission.condition.js +23 -0
  104. package/dist-cms/packages/users/current-user/index.d.ts +1 -0
  105. package/dist-cms/packages/users/current-user/index.js +1 -0
  106. package/dist-cms/packages/users/current-user/manifests.js +7 -1
  107. package/dist-cms/packages/users/current-user/modals/current-user/current-user-modal.element.js +7 -7
  108. package/dist-cms/packages/users/index.d.ts +4 -2
  109. package/dist-cms/packages/users/index.js +4 -2
  110. package/dist-cms/packages/users/manifests.d.ts +2 -0
  111. package/dist-cms/packages/users/manifests.js +3 -0
  112. package/dist-cms/packages/users/user-groups/collection/user-group-collection-header.element.js +2 -2
  113. package/dist-cms/packages/users/user-groups/collection/user-group-collection-view.element.js +6 -6
  114. package/dist-cms/packages/users/user-groups/components/index.d.ts +1 -0
  115. package/dist-cms/packages/users/user-groups/components/index.js +1 -0
  116. package/dist-cms/packages/users/user-groups/entity-actions/manifests.d.ts +2 -0
  117. package/dist-cms/packages/users/user-groups/entity-actions/manifests.js +19 -0
  118. package/dist-cms/packages/users/user-groups/index.d.ts +2 -0
  119. package/dist-cms/packages/users/user-groups/index.js +2 -0
  120. package/dist-cms/packages/users/user-groups/manifests.d.ts +1 -1
  121. package/dist-cms/packages/users/user-groups/manifests.js +2 -0
  122. package/dist-cms/packages/users/user-groups/workspace/components/user-group-default-permission-list.element.d.ts +16 -0
  123. package/dist-cms/packages/users/user-groups/workspace/components/user-group-default-permission-list.element.js +69 -0
  124. package/dist-cms/packages/users/user-groups/workspace/components/user-group-granular-permission-list.element.d.ts +14 -0
  125. package/dist-cms/packages/users/user-groups/workspace/components/user-group-granular-permission-list.element.js +31 -0
  126. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace-editor.element.d.ts +2 -0
  127. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace-editor.element.js +57 -56
  128. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.context.d.ts +12 -0
  129. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.context.js +20 -0
  130. package/dist-cms/packages/users/user-groups/workspace/user-group-workspace.element.js +1 -1
  131. package/dist-cms/packages/users/users/collection/user-collection-header.element.js +18 -11
  132. package/dist-cms/packages/users/users/collection/views/grid/user-collection-grid-view.element.js +6 -6
  133. package/dist-cms/packages/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.js +3 -3
  134. package/dist-cms/packages/users/users/components/index.d.ts +3 -0
  135. package/dist-cms/packages/users/users/components/index.js +3 -0
  136. package/dist-cms/packages/users/users/components/user-input/user-input.element.js +2 -2
  137. package/dist-cms/packages/users/users/components/user-permission-setting/user-permission-setting.element.d.ts +15 -0
  138. package/dist-cms/packages/users/users/components/user-permission-setting/user-permission-setting.element.js +66 -0
  139. package/dist-cms/packages/users/users/index.d.ts +2 -0
  140. package/dist-cms/packages/users/users/index.js +2 -0
  141. package/dist-cms/packages/users/users/modals/user-picker/user-picker-modal.element.d.ts +3 -1
  142. package/dist-cms/packages/users/users/modals/user-picker/user-picker-modal.element.js +20 -25
  143. package/dist-cms/packages/users/users/repository/index.d.ts +1 -0
  144. package/dist-cms/packages/users/users/repository/index.js +1 -0
  145. package/dist-cms/packages/users/users/repository/user.repository.js +1 -1
  146. package/dist-cms/packages/users/users/workspace/user-workspace-editor.element.js +73 -56
  147. package/dist-cms/packages/users/utils.d.ts +5 -2
  148. package/dist-cms/packages/users/utils.js +14 -14
  149. package/dist-cms/shared/auth/auth-flow.d.ts +0 -4
  150. package/dist-cms/shared/auth/auth-flow.js +6 -25
  151. package/dist-cms/shared/repository/repository-items.manager.js +5 -0
  152. package/dist-cms/shared/umb-events/index.d.ts +1 -0
  153. package/dist-cms/shared/umb-events/index.js +1 -0
  154. package/dist-cms/shared/umb-events/selected.event.d.ts +3 -0
  155. package/dist-cms/shared/umb-events/selected.event.js +6 -0
  156. package/dist-cms/tsconfig.build.tsbuildinfo +1 -1
  157. package/dist-cms/umbraco-package-schema.json +154 -0
  158. package/dist-cms/vscode-html-custom-data.json +66 -18
  159. package/package.json +1 -1
  160. package/dist-cms/mocks/data/user-groups.data.d.ts +0 -9
  161. package/dist-cms/mocks/data/user-groups.data.js +0 -21
  162. package/dist-cms/mocks/data/users.data.d.ts +0 -16
  163. package/dist-cms/mocks/handlers/user-group.handlers.js +0 -17
  164. /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 { getLookAndColorFromUserStatus } from '../../utils.js';
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="Email">
156
- <uui-input slot="editor" name="email" label="email" readonly value=${ifDefined(this._user.email)}></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 label="Language" description="The language of the UI in the Backoffice">
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="language"
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 access</div>
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 label="Groups" description="Add groups to assign access and permissions">
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="Content start node"
179
- description="Limit the content tree to specific start nodes">
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="Media start nodes"
187
- description="Limit the media library to specific start nodes">
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="Access">
189
+ <uui-box headline=${this.localize.term('user_access')}>
193
190
  <div slot="header" class="faded-text">
194
- Based on the assigned groups and start nodes, the user has access to the following nodes
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 statusLook = getLookAndColorFromUserStatus(this._user.state);
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="Change photo"></uui-button>
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:</b>
219
- <uui-tag look="${ifDefined(statusLook?.look)}" color="${ifDefined(statusLook?.color)}">
220
- ${this._user.state}
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="Enter a message..."> </uui-textarea>
227
- <uui-button look="primary" label="Resend invitation"></uui-button>
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('Last login', this._user.lastLoginDate || `${this._user.name} has not logged in yet`)}
231
- ${this.#renderInfoItem('Failed login attempts', this._user.failedLoginAttempts)}
232
- ${this.#renderInfoItem('Last lockout date', this._user.lastLockoutDate || `${this._user.name} has not been locked out`)}
233
- ${this.#renderInfoItem('Password last changed', this._user.lastLoginDate || `${this._user.name} has not changed password`)}
234
- ${this.#renderInfoItem('User created', this._user.createDate)}
235
- ${this.#renderInfoItem('User last updated', this._user.updateDate)}
236
- ${this.#renderInfoItem('Key', this._user.id)}
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(label, value) {
240
+ #renderInfoItem(labelkey, value) {
241
241
  return html `
242
242
  <div>
243
- <b>${label}</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.state === UserStateModel.DISABLED) {
255
- buttons.push(html `
256
- <uui-button @click=${this.#onUserStatusChange} look="secondary" color="positive" label="Enable"></uui-button>
257
- `);
258
- }
259
- if (this._user.state === UserStateModel.ACTIVE || this._user.state === UserStateModel.INACTIVE) {
260
- buttons.push(html `
261
- <uui-button @click=${this.#onUserStatusChange} look="secondary" color="warning" label="Disable"></uui-button>
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 @click=${this.#onUserDelete} look="secondary" color="danger" label="Delete User"></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 @click=${this.#onPasswordChange} look="secondary" label="Change password"></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
- export declare const getLookAndColorFromUserStatus: (status?: UserStateModel) => {
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
- import { UserStateModel } from '../../external/backend-api/index.js';
2
- export const getLookAndColorFromUserStatus = (status) => {
3
- switch (status) {
4
- case UserStateModel.INACTIVE:
5
- case UserStateModel.INVITED:
6
- return { look: 'primary', color: 'warning' };
7
- case UserStateModel.ACTIVE:
8
- return { look: 'primary', color: 'positive' };
9
- case UserStateModel.DISABLED:
10
- return { look: 'primary', color: 'danger' };
11
- default:
12
- return { look: 'secondary', color: 'default' };
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() {
@@ -2,3 +2,4 @@ export * from './input.event.js';
2
2
  export * from './change.event.js';
3
3
  export * from './delete.event.js';
4
4
  export * from './executed.event.js';
5
+ export * from './selected.event.js';
@@ -2,3 +2,4 @@ export * from './input.event.js';
2
2
  export * from './change.event.js';
3
3
  export * from './delete.event.js';
4
4
  export * from './executed.event.js';
5
+ export * from './selected.event.js';
@@ -0,0 +1,3 @@
1
+ export declare class UmbSelectedEvent extends Event {
2
+ constructor();
3
+ }
@@ -0,0 +1,6 @@
1
+ export class UmbSelectedEvent extends Event {
2
+ constructor() {
3
+ // mimics the native change event
4
+ super('selected', { bubbles: true, composed: false, cancelable: false });
5
+ }
6
+ }