@umbraco-cms/backoffice 18.0.0-rc2 → 18.0.0-rc3

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 (23) hide show
  1. package/dist-cms/apps/app/app.element.js +6 -1
  2. package/dist-cms/assets/lang/de.js +1 -1
  3. package/dist-cms/assets/lang/fr.js +1 -1
  4. package/dist-cms/assets/lang/nb.js +1 -1
  5. package/dist-cms/assets/lang/nl.js +1 -1
  6. package/dist-cms/assets/lang/sv.js +1 -1
  7. package/dist-cms/libs/extension-api/initializers/extension-initializer-base.js +26 -2
  8. package/dist-cms/packages/content/content-type/workspace/views/design/content-type-design-editor-tab.element.js +1 -0
  9. package/dist-cms/packages/core/collection/components/pagination/collection-pagination.element.js +1 -2
  10. package/dist-cms/packages/core/components/multiple-text-string-input/input-multiple-text-string-item.element.js +18 -1
  11. package/dist-cms/packages/core/picker/search/picker-search-result.element.js +1 -2
  12. package/dist-cms/packages/documents/document-redirect-management/dashboard-redirect-management.element.js +0 -4
  13. package/dist-cms/packages/documents/documents/audit-log/info-app/document-history-workspace-info-app.element.js +0 -3
  14. package/dist-cms/packages/log-viewer/workspace/views/search/components/log-viewer-messages-list.element.js +0 -1
  15. package/dist-cms/packages/media/media/audit-log/info-app/media-history-workspace-info-app.element.js +0 -3
  16. package/dist-cms/packages/media/media/modals/media-picker/media-picker-modal.element.js +0 -1
  17. package/dist-cms/packages/members/member-group/components/member-group-picker-modal/member-group-picker-modal.element.js +0 -1
  18. package/dist-cms/packages/packages/package-section/views/created/packages-created-overview.element.js +0 -3
  19. package/dist-cms/packages/relations/relation-types/workspace/relation-type/views/relation-type-detail-workspace-view.element.js +0 -1
  20. package/dist-cms/packages/relations/relations/reference/workspace-info-app/entity-references-workspace-view-info.element.js +0 -5
  21. package/dist-cms/packages/user/current-user/history/current-user-history-user-profile-app.element.js +0 -2
  22. package/dist-cms/tsconfig.build.tsbuildinfo +1 -1
  23. package/package.json +1 -1
@@ -219,7 +219,7 @@ let UmbAppElement = class UmbAppElement extends UmbLitElement {
219
219
  onInit(this, umbExtensionsRegistry);
220
220
  // Register public extensions (login extensions)
221
221
  await new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerPublicExtensions();
222
- new UmbAppEntryPointExtensionInitializer(this, umbExtensionsRegistry);
222
+ const entryPointInitializer = new UmbAppEntryPointExtensionInitializer(this, umbExtensionsRegistry);
223
223
  // Try to initialise the auth flow and get the runtime status
224
224
  try {
225
225
  // If the runtime level is "install" or ?status=false is set, we should clear any cached tokens
@@ -232,6 +232,11 @@ let UmbAppElement = class UmbAppElement extends UmbLitElement {
232
232
  else {
233
233
  await this.#setAuthStatus();
234
234
  }
235
+ // The login screen decides which auth provider to use from the registered
236
+ // `authProvider` extensions. App-entry-points may register or unregister those during
237
+ // their async onInit, so wait for them to settle before routing — otherwise on a slow
238
+ // connection the decision races and falls back to the local login.
239
+ await this.observe(entryPointInitializer.loaded).asPromise();
235
240
  // Initialise the router
236
241
  this.#redirect();
237
242
  }
@@ -967,7 +967,7 @@ export default {
967
967
  greeting5: 'Willkommen',
968
968
  greeting6: 'Willkommen',
969
969
  instruction: 'Hier anmelden:',
970
- signInWith: 'Anmelden mit',
970
+ signInWith: 'Anmelden mit {0}',
971
971
  timeout: 'Sitzung abgelaufen',
972
972
  forgottenPassword: 'Kennwort vergessen?',
973
973
  forgottenPasswordInstruction: 'Es wird eine E-Mail mit einem Kennwort-Zurücksetzen-Link an die angegebene Adresse geschickt.',
@@ -848,7 +848,7 @@ export default {
848
848
  greeting5: 'Bienvenue',
849
849
  greeting6: 'Bienvenue',
850
850
  instruction: 'Connectez-vous ci-dessous',
851
- signInWith: 'Identifiez-vous avec',
851
+ signInWith: 'Identifiez-vous avec {0}',
852
852
  timeout: 'La session a expiré',
853
853
  forgottenPassword: 'Mot de passe oublié?',
854
854
  forgottenPasswordInstruction: "Un email contenant un lien pour ré-initialiser votre mot de passe sera envoyé à l'adresse spécifiée",
@@ -660,7 +660,7 @@ export default {
660
660
  greeting5: 'Velkommen',
661
661
  greeting6: 'Velkommen',
662
662
  instruction: 'Logg på nedenfor',
663
- signInWith: 'Logg på med',
663
+ signInWith: 'Logg på med {0}',
664
664
  timeout: 'Din sesjon er utløpt',
665
665
  continue: 'Fortsett',
666
666
  validate: 'Valider',
@@ -866,7 +866,7 @@ export default {
866
866
  greeting5: 'Welkom',
867
867
  greeting6: 'Welkom',
868
868
  instruction: 'log hieronder in',
869
- signInWith: 'Inloggen met',
869
+ signInWith: 'Inloggen met {0}',
870
870
  timeout: 'Sessie is verlopen',
871
871
  forgottenPassword: 'Wachtwoord vergeten?',
872
872
  forgottenPasswordInstruction: 'Er zal een e-mail worden gestuurd naar het e-mailadres van jouw account.\n Hierin staat een link om je wachtwoord te resetten\n ',
@@ -643,7 +643,7 @@ export default {
643
643
  greeting5: 'Välkommen',
644
644
  greeting6: 'Välkommen',
645
645
  instruction: 'Logga in nedan',
646
- signInWith: 'Logga in med',
646
+ signInWith: 'Logga in med {0}',
647
647
  timeout: 'Sessionen har nått sin maxgräns',
648
648
  continue: 'Fortsätt',
649
649
  validate: 'Validera',
@@ -7,28 +7,52 @@ export class UmbExtensionInitializerBase extends UmbControllerBase {
7
7
  #extensionMap;
8
8
  // Use the value `undefined`, as that would not resolve a observation promise. [NL]
9
9
  #loaded;
10
+ // Identifies the current processing pass. The observer callback is async, so passes can
11
+ // overlap; only the latest pass is allowed to settle `loaded`, so a slower earlier pass
12
+ // cannot unblock waiters before the newest set of extensions has finished instantiating.
13
+ #loadPass;
10
14
  constructor(host, extensionRegistry, manifestType) {
11
15
  super(host);
12
16
  this.#extensionMap = new Map();
13
17
  // Use the value `undefined`, as that would not resolve a observation promise. [NL]
14
18
  this.#loaded = new UmbBooleanState(undefined);
15
19
  this.loaded = this.#loaded.asObservable();
20
+ // Identifies the current processing pass. The observer callback is async, so passes can
21
+ // overlap; only the latest pass is allowed to settle `loaded`, so a slower earlier pass
22
+ // cannot unblock waiters before the newest set of extensions has finished instantiating.
23
+ this.#loadPass = 0;
16
24
  this.host = host;
17
25
  this.extensionRegistry = extensionRegistry;
18
26
  this.observe(extensionRegistry.byType(manifestType), async (extensions) => {
27
+ const pass = ++this.#loadPass;
28
+ // Re-arm while this pass is in flight so a consumer awaiting `loaded` waits for it to
29
+ // finish instead of resolving on a stale `true` from a previous pass. `undefined`
30
+ // rather than `false` because `asPromise()` resolves on the first non-undefined value.
31
+ this.#loaded.setValue(undefined);
19
32
  this.#extensionMap.forEach((existingExt) => {
20
33
  if (!extensions.find((b) => b.alias === existingExt.alias)) {
21
34
  this.unloadExtension(existingExt);
22
35
  this.#extensionMap.delete(existingExt.alias);
23
36
  }
24
37
  });
25
- await Promise.all(extensions.map((extension) => {
38
+ // `allSettled` so a throwing/rejecting `instantiateExtension` cannot leave `loaded`
39
+ // stuck at `undefined` and hang a waiter (e.g. the app boot gate). Failures are
40
+ // surfaced rather than swallowed.
41
+ const results = await Promise.allSettled(extensions.map((extension) => {
26
42
  if (this.#extensionMap.has(extension.alias))
27
43
  return;
28
44
  this.#extensionMap.set(extension.alias, extension);
29
45
  return this.instantiateExtension(extension);
30
46
  }));
31
- if (extensions.length > 0) {
47
+ for (const result of results) {
48
+ if (result.status === 'rejected') {
49
+ console.error('[UmbExtensionInitializer] Failed to instantiate extension', result.reason);
50
+ }
51
+ }
52
+ // Only the latest pass settles `loaded`. Resolving unconditionally — including for
53
+ // zero extensions — so a consumer awaiting `loaded` (the app-entry-point boot gate,
54
+ // the bundle guard) never hangs on a default install that registers none of this type.
55
+ if (pass === this.#loadPass) {
32
56
  this.#loaded.setValue(true);
33
57
  }
34
58
  });
@@ -242,6 +242,7 @@ let UmbContentTypeDesignEditorTabElement = class UmbContentTypeDesignEditorTabEl
242
242
  uui-box.opaque {
243
243
  background-color: transparent;
244
244
  border-color: transparent;
245
+ --uui-box-default-padding: 0;
245
246
  }
246
247
 
247
248
  .container-list {
@@ -67,8 +67,7 @@ let UmbCollectionPaginationElement = class UmbCollectionPaginationElement extend
67
67
  }
68
68
 
69
69
  uui-pagination {
70
- display: block;
71
- margin-top: var(--uui-size-layout-1);
70
+ margin-top: var(--uui-size-space-3);
72
71
  }
73
72
  `,
74
73
  ]; }
@@ -95,7 +95,6 @@ let UmbInputMultipleTextStringItemElement = class UmbInputMultipleTextStringItem
95
95
  <uui-button
96
96
  compact
97
97
  label="${this.localize.term('general_remove')} ${this.value}"
98
- look="outline"
99
98
  ?disabled=${this.disabled}
100
99
  @click=${this.#onDelete}>
101
100
  <uui-icon name="icon-trash"></uui-icon>
@@ -114,6 +113,7 @@ let UmbInputMultipleTextStringItemElement = class UmbInputMultipleTextStringItem
114
113
 
115
114
  #validation-message {
116
115
  flex: 1;
116
+ margin-bottom: calc(var(--uui-size-1) * -1);
117
117
  }
118
118
 
119
119
  #input {
@@ -122,11 +122,28 @@ let UmbInputMultipleTextStringItemElement = class UmbInputMultipleTextStringItem
122
122
 
123
123
  .handle {
124
124
  cursor: grab;
125
+ opacity: 0.6;
126
+ transition: opacity 120ms;
125
127
  }
126
128
 
127
129
  .handle:active {
128
130
  cursor: grabbing;
129
131
  }
132
+
133
+ uui-button {
134
+ opacity: 0;
135
+ transition: opacity 120ms;
136
+ }
137
+
138
+ :host(:hover),
139
+ :host(:focus-within) {
140
+ uui-button {
141
+ opacity: 1;
142
+ }
143
+ .handle {
144
+ opacity: 1;
145
+ }
146
+ }
130
147
  `,
131
148
  ]; }
132
149
  };
@@ -109,8 +109,7 @@ let UmbPickerSearchResultElement = class UmbPickerSearchResultElement extends Um
109
109
  }
110
110
 
111
111
  uui-pagination {
112
- display: block;
113
- margin-top: var(--uui-size-layout-1);
112
+ margin-top: var(--uui-size-space-3);
114
113
  }
115
114
  `,
116
115
  ]; }
@@ -254,10 +254,6 @@ let UmbDashboardRedirectManagementElement = class UmbDashboardRedirectManagement
254
254
  }
255
255
  }
256
256
 
257
- uui-pagination {
258
- display: inline-block;
259
- }
260
-
261
257
  .pagination {
262
258
  display: flex;
263
259
  justify-content: center;
@@ -171,9 +171,6 @@ let UmbDocumentHistoryWorkspaceInfoAppElement = class UmbDocumentHistoryWorkspac
171
171
  }
172
172
 
173
173
  uui-pagination {
174
- flex: 1;
175
- display: flex;
176
- justify-content: center;
177
174
  margin-top: var(--uui-size-layout-1);
178
175
  }
179
176
  `,
@@ -120,7 +120,6 @@ let UmbLogViewerMessagesListElement = class UmbLogViewerMessagesListElement exte
120
120
  static { this.styles = [
121
121
  css `
122
122
  uui-pagination {
123
- display: block;
124
123
  margin-bottom: var(--uui-size-layout-1);
125
124
  }
126
125
  uui-box {
@@ -160,9 +160,6 @@ let UmbMediaHistoryWorkspaceInfoAppElement = class UmbMediaHistoryWorkspaceInfoA
160
160
  }
161
161
 
162
162
  uui-pagination {
163
- flex: 1;
164
- display: flex;
165
- justify-content: center;
166
163
  margin-top: var(--uui-size-layout-1);
167
164
  }
168
165
  `,
@@ -599,7 +599,6 @@ let UmbMediaPickerModalElement = class UmbMediaPickerModalElement extends UmbPic
599
599
  }
600
600
 
601
601
  uui-pagination {
602
- display: block;
603
602
  margin-top: var(--uui-size-layout-1);
604
603
  }
605
604
 
@@ -97,7 +97,6 @@ let UmbMemberGroupPickerModalElement = class UmbMemberGroupPickerModalElement ex
97
97
  static { this.styles = [
98
98
  css `
99
99
  uui-pagination {
100
- display: block;
101
100
  margin-top: var(--uui-size-layout-1);
102
101
  }
103
102
  `,
@@ -124,9 +124,6 @@ let UmbPackagesCreatedOverviewElement = class UmbPackagesCreatedOverviewElement
124
124
  display: flex;
125
125
  justify-content: space-around;
126
126
  }
127
- uui-pagination {
128
- display: inline-block;
129
- }
130
127
 
131
128
  .container {
132
129
  display: flex;
@@ -186,7 +186,6 @@ let UmbRelationTypeDetailWorkspaceViewElement = class UmbRelationTypeDetailWorks
186
186
 
187
187
  uui-pagination {
188
188
  margin-top: var(--uui-size-layout-1);
189
- display: block;
190
189
  }
191
190
  `,
192
191
  ]; }
@@ -132,11 +132,6 @@ let UmbEntityReferencesWorkspaceInfoAppElement = class UmbEntityReferencesWorksp
132
132
  justify-content: center;
133
133
  margin-top: var(--uui-size-space-4);
134
134
  }
135
-
136
- uui-pagination {
137
- flex: 1;
138
- display: inline-block;
139
- }
140
135
  `,
141
136
  ]; }
142
137
  };
@@ -94,8 +94,6 @@ let UmbCurrentUserHistoryUserProfileAppElement = class UmbCurrentUserHistoryUser
94
94
  }
95
95
 
96
96
  uui-pagination {
97
- display: flex;
98
- justify-content: center;
99
97
  margin-top: var(--uui-size-layout-1);
100
98
  }
101
99
  `,