@umbraco-cms/backoffice 16.0.0-rc3 → 16.0.0-rc5
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/backoffice/backoffice.context.js +5 -1
- package/dist-cms/apps/backoffice/components/backoffice-main.element.js +3 -1
- package/dist-cms/assets/lang/en-us.js +1 -1
- package/dist-cms/assets/lang/en-us.ts +1 -1
- package/dist-cms/css/uui-css.css +481 -100
- package/dist-cms/custom-elements.json +33 -17
- package/dist-cms/external/rxjs/index.d.ts +1 -1
- package/dist-cms/external/rxjs/index.js +3 -3
- package/dist-cms/external/uui/index.js +663 -393
- package/dist-cms/libs/context-api/consume/context-consumer.js +1 -2
- package/dist-cms/libs/controller-api/controller-host.mixin.js +2 -2
- package/dist-cms/libs/extension-api/controller/server-extension-registrator.controller.js +6 -2
- package/dist-cms/packages/block/block/context/block-entry.context.js +10 -3
- package/dist-cms/packages/block/block/workspace/views/edit/block-workspace-view-edit.element.js +1 -0
- package/dist-cms/packages/block/block-list/components/block-list-entry/block-list-entry.element.js +2 -1
- package/dist-cms/packages/content/content/components/property-type-based-property/index.d.ts +2 -0
- package/dist-cms/packages/content/content/components/property-type-based-property/index.js +2 -0
- package/dist-cms/packages/content/content/components/property-type-based-property/property-type-based-property.context-token.d.ts +8 -0
- package/dist-cms/packages/content/content/components/property-type-based-property/property-type-based-property.context-token.js +7 -0
- package/dist-cms/packages/content/content/{content-property.context.d.ts → components/property-type-based-property/property-type-based-property.context.d.ts} +6 -1
- package/dist-cms/packages/content/content/components/property-type-based-property/property-type-based-property.context.js +19 -0
- package/dist-cms/packages/content/content/components/property-type-based-property/property-type-based-property.element.d.ts +1 -1
- package/dist-cms/packages/content/content/components/property-type-based-property/property-type-based-property.element.js +8 -7
- package/dist-cms/packages/content/content/global-components/content-workspace-property.element.d.ts +26 -0
- package/dist-cms/packages/content/content/global-components/content-workspace-property.element.js +104 -0
- package/dist-cms/packages/content/content/global-components/index.d.ts +1 -0
- package/dist-cms/packages/content/content/global-components/index.js +1 -0
- package/dist-cms/packages/content/content/index.d.ts +1 -2
- package/dist-cms/packages/content/content/index.js +1 -2
- package/dist-cms/packages/content/content/workspace/content-detail-workspace-base.js +2 -1
- package/dist-cms/packages/content/content/workspace/views/edit/content-editor-properties.element.d.ts +1 -3
- package/dist-cms/packages/content/content/workspace/views/edit/content-editor-properties.element.js +8 -48
- package/dist-cms/packages/content/content/workspace/views/edit/content-editor.element.js +1 -0
- package/dist-cms/packages/content/content-type/structure/content-type-property-structure-helper.class.d.ts +1 -0
- package/dist-cms/packages/content/content-type/structure/content-type-property-structure-helper.class.js +1 -0
- package/dist-cms/packages/content/content-type/structure/content-type-structure-manager.class.d.ts +1 -0
- package/dist-cms/packages/content/content-type/structure/content-type-structure-manager.class.js +3 -3
- package/dist-cms/packages/content/content-type/workspace/views/design/content-type-design-editor.element.js +11 -7
- package/dist-cms/packages/content/property-type/workspace/property-type-workspace.context.js +5 -1
- package/dist-cms/packages/core/collection/collection-view.manager.js +4 -4
- package/dist-cms/packages/core/collection/components/collection-filter-field.element.js +1 -1
- package/dist-cms/packages/core/components/input-number-range/input-number-range.element.d.ts +4 -1
- package/dist-cms/packages/core/components/input-number-range/input-number-range.element.js +27 -3
- package/dist-cms/packages/core/components/input-with-alias/input-with-alias.element.js +0 -2
- package/dist-cms/packages/core/localization/manifests.js +27 -27
- package/dist-cms/packages/core/localization/registry/localization.registry.d.ts +2 -1
- package/dist-cms/packages/core/localization/registry/localization.registry.js +97 -37
- package/dist-cms/packages/core/menu/menu-variant-tree-structure-workspace-context-base.js +2 -2
- package/dist-cms/packages/core/package.json +2 -2
- package/dist-cms/packages/core/property/components/property/property.element.js +1 -0
- package/dist-cms/packages/core/property-editor/extensions/property-editor-ui-element.interface.d.ts +2 -0
- package/dist-cms/packages/core/repository/detail/detail-repository-base.js +6 -7
- package/dist-cms/packages/core/repository/item/item-repository-base.d.ts +1 -1
- package/dist-cms/packages/core/repository/item/item-repository-base.js +25 -9
- package/dist-cms/packages/core/repository/item/item-repository.interface.d.ts +1 -1
- package/dist-cms/packages/core/router/route/router-slot.element.js +3 -1
- package/dist-cms/packages/core/router/router-slot/model.d.ts +1 -0
- package/dist-cms/packages/core/router/router-slot/router-slot.d.ts +1 -0
- package/dist-cms/packages/core/router/router-slot/router-slot.js +30 -0
- package/dist-cms/packages/core/tree/data/tree-repository-base.d.ts +5 -1
- package/dist-cms/packages/core/tree/data/tree-repository-base.js +27 -13
- package/dist-cms/packages/core/tree/tree-item/tree-item.element.js +1 -1
- package/dist-cms/packages/core/validation/controllers/validation.controller.js +1 -1
- package/dist-cms/packages/core/workspace/components/workspace-action/common/save/save.action.js +3 -1
- package/dist-cms/packages/core/workspace/components/workspace-breadcrumb/workspace-variant-menu-breadcrumb/workspace-variant-menu-breadcrumb.element.js +5 -2
- package/dist-cms/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.js +2 -2
- package/dist-cms/packages/core/workspace/contexts/tokens/submittable-tree-entity-workspace.context-token.js +1 -1
- package/dist-cms/packages/core/workspace/controllers/workspace-is-new-redirect.controller.d.ts +7 -0
- package/dist-cms/packages/core/workspace/controllers/workspace-is-new-redirect.controller.js +31 -10
- package/dist-cms/packages/core/workspace/controllers/workspace-route-manager.controller.js +5 -5
- package/dist-cms/packages/core/workspace/entity-detail/entity-detail-workspace-base.js +1 -1
- package/dist-cms/packages/core/workspace/submittable/submittable-workspace-context-base.d.ts +1 -0
- package/dist-cms/packages/core/workspace/submittable/submittable-workspace-context-base.js +10 -0
- package/dist-cms/packages/data-type/collection/repository/data-type-collection.repository.js +6 -1
- package/dist-cms/packages/data-type/repository/detail/data-type-detail.repository.js +6 -1
- package/dist-cms/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.js +5 -4
- package/dist-cms/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.js +1 -1
- package/dist-cms/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.js +12 -2
- package/dist-cms/packages/documents/documents/tree/document-tree.context.js +2 -2
- package/dist-cms/packages/documents/documents/types.d.ts +1 -0
- package/dist-cms/packages/documents/documents/url/index.d.ts +1 -0
- package/dist-cms/packages/documents/documents/url/index.js +1 -0
- package/dist-cms/packages/documents/documents/url/types.d.ts +1 -0
- package/dist-cms/packages/documents/documents/url/types.js +1 -0
- package/dist-cms/packages/documents/documents/user-permissions/document/conditions/document-user-permission.condition.js +3 -1
- package/dist-cms/packages/documents/documents/workspace/actions/save.action.js +4 -2
- package/dist-cms/packages/documents/documents/workspace/document-workspace-editor.element.js +13 -7
- package/dist-cms/packages/log-viewer/components/log-viewer-date-range-selector.element.d.ts +0 -2
- package/dist-cms/packages/log-viewer/components/log-viewer-date-range-selector.element.js +12 -24
- package/dist-cms/packages/log-viewer/repository/sources/log-viewer.server.data.js +9 -1
- package/dist-cms/packages/log-viewer/workspace/views/search/components/log-viewer-message.element.js +1 -1
- package/dist-cms/packages/media/media/dashboard/media-dashboard.element.js +1 -0
- package/dist-cms/packages/media/media/modals/media-picker/media-picker-modal.element.js +2 -2
- package/dist-cms/packages/media/media/tree/media-tree.context.js +2 -2
- package/dist-cms/packages/media/media/workspace/media-workspace-editor.element.js +1 -0
- package/dist-cms/packages/members/member/repository/member-repository-base.d.ts +8 -8
- package/dist-cms/packages/members/member/repository/member-repository-base.js +13 -12
- package/dist-cms/packages/members/member/workspace/member/member-workspace-editor.element.js +1 -0
- package/dist-cms/packages/packages/package-section/views/created/created-packages-section-view.element.js +1 -0
- package/dist-cms/packages/property-editors/dimensions/property-editor-ui-dimensions.element.js +16 -3
- package/dist-cms/packages/segment/package.json +8 -0
- package/dist-cms/packages/settings/package.json +8 -0
- package/dist-cms/packages/settings/vite.config.d.ts +2 -0
- package/dist-cms/packages/settings/vite.config.js +11 -0
- package/dist-cms/packages/templating/partial-views/entity-actions/rename/rename-partial-view.server.data-source.js +1 -1
- package/dist-cms/packages/templating/partial-views/repository/partial-view-detail.server.data-source.js +3 -3
- package/dist-cms/packages/templating/partial-views/tree/folder/repository/partial-view-folder.server.data-source.js +2 -2
- package/dist-cms/packages/templating/scripts/entity-actions/rename/rename-script.server.data-source.js +1 -1
- package/dist-cms/packages/templating/scripts/repository/script-detail.server.data-source.js +3 -3
- package/dist-cms/packages/templating/scripts/tree/folder/repository/script-folder.server.data-source.js +2 -2
- package/dist-cms/packages/templating/stylesheets/entity-actions/rename/rename-stylesheet.server.data-source.js +1 -1
- package/dist-cms/packages/templating/stylesheets/repository/stylesheet-detail.server.data-source.js +3 -3
- package/dist-cms/packages/templating/stylesheets/tree/folder/repository/stylesheet-folder.server.data-source.js +2 -2
- package/dist-cms/packages/tiptap/components/character-map/character-map-modal.element.js +0 -4
- package/dist-cms/packages/tiptap/components/input-tiptap/input-tiptap.element.js +1 -1
- package/dist-cms/packages/tiptap/components/input-tiptap/tiptap-toolbar.element.d.ts +6 -0
- package/dist-cms/packages/tiptap/components/input-tiptap/tiptap-toolbar.element.js +7 -1
- package/dist-cms/packages/tiptap/property-editors/tiptap/components/property-editor-ui-tiptap-extensions-configuration.element.js +1 -1
- package/dist-cms/packages/tiptap/property-editors/tiptap/components/property-editor-ui-tiptap-statusbar-configuration.element.js +0 -4
- package/dist-cms/packages/tiptap/property-editors/tiptap/components/property-editor-ui-tiptap-toolbar-configuration.element.js +1 -4
- package/dist-cms/packages/translation/package.json +8 -0
- package/dist-cms/packages/user/current-user/current-user.context.js +4 -1
- package/dist-cms/packages/user/current-user/repository/current-user.repository.d.ts +2 -2
- package/dist-cms/packages/user/current-user/repository/current-user.repository.js +8 -5
- package/dist-cms/packages/user/user/repository/user-repository-base.d.ts +7 -7
- package/dist-cms/packages/user/user/repository/user-repository-base.js +13 -12
- package/dist-cms/packages/user/user-group/collection/repository/user-group-collection.repository.js +4 -1
- package/dist-cms/packages/user/user-group/collection/user-group-collection.element.js +1 -1
- package/dist-cms/packages/webhook/webhook-event/repository/webhook-event.repository.d.ts +4 -0
- package/dist-cms/packages/webhook/webhook-event/repository/webhook-event.repository.js +7 -1
- package/dist-cms/tsconfig.build.tsbuildinfo +1 -1
- package/dist-cms/umbraco-package.json +1 -1
- package/dist-cms/vscode-html-custom-data.json +16 -10
- package/examples/modal-routed/dashboard.element.ts +1 -0
- package/examples/modal-routed/modal/example-modal.element.ts +1 -0
- package/examples/validation-context/validation-context-dashboard.ts +12 -12
- package/package.json +8 -7
- package/dist-cms/packages/content/content/content-property.context-token.d.ts +0 -3
- package/dist-cms/packages/content/content/content-property.context-token.js +0 -2
- package/dist-cms/packages/content/content/content-property.context.js +0 -14
- package/dist-cms/packages/content/content/workspace/views/edit/content-editor-property.element.d.ts +0 -21
- package/dist-cms/packages/content/content/workspace/views/edit/content-editor-property.element.js +0 -63
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { UmbRepositoryBase } from '../repository-base.js';
|
|
2
|
+
import { of } from '@umbraco-cms/backoffice/external/rxjs';
|
|
2
3
|
export class UmbItemRepositoryBase extends UmbRepositoryBase {
|
|
3
4
|
#itemSource;
|
|
4
5
|
constructor(host, itemSource, itemStoreContextAlias) {
|
|
5
6
|
super(host);
|
|
6
7
|
this.#itemSource = new itemSource(host);
|
|
7
8
|
this._init = this.consumeContext(itemStoreContextAlias, (instance) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
9
|
+
this._itemStore = instance;
|
|
10
|
+
})
|
|
11
|
+
.asPromise({ preventTimeout: true })
|
|
12
|
+
// Ignore the error, we can assume that the flow was stopped (asPromise failed), but it does not mean that the consumption was not successful.
|
|
13
|
+
.catch(() => undefined);
|
|
12
14
|
}
|
|
13
15
|
/**
|
|
14
16
|
* Requests the items for the given uniques
|
|
@@ -19,17 +21,22 @@ export class UmbItemRepositoryBase extends UmbRepositoryBase {
|
|
|
19
21
|
async requestItems(uniques) {
|
|
20
22
|
if (!uniques)
|
|
21
23
|
throw new Error('Uniques are missing');
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
try {
|
|
25
|
+
await this._init;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
const { data, error } = await this.#itemSource.getItems(uniques);
|
|
24
31
|
if (!this._itemStore) {
|
|
25
32
|
// If store is gone, then we are most likely in a disassembled state.
|
|
26
33
|
return {};
|
|
27
34
|
}
|
|
28
|
-
const error = _error;
|
|
29
35
|
if (data) {
|
|
30
36
|
this._itemStore.appendItems(data);
|
|
31
37
|
}
|
|
32
|
-
|
|
38
|
+
// TODO: Fix the type of error, it should be UmbApiError, but currently it is any.
|
|
39
|
+
return { data, error: error, asObservable: () => this._itemStore.items(uniques) };
|
|
33
40
|
}
|
|
34
41
|
/**
|
|
35
42
|
* Returns a promise with an observable of the items for the given uniques
|
|
@@ -38,7 +45,16 @@ export class UmbItemRepositoryBase extends UmbRepositoryBase {
|
|
|
38
45
|
* @memberof UmbItemRepositoryBase
|
|
39
46
|
*/
|
|
40
47
|
async items(uniques) {
|
|
41
|
-
|
|
48
|
+
try {
|
|
49
|
+
await this._init;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
if (!this._itemStore) {
|
|
55
|
+
// If store is gone, then we are most likely in a disassembled state.
|
|
56
|
+
return of([]);
|
|
57
|
+
}
|
|
42
58
|
return this._itemStore.items(uniques);
|
|
43
59
|
}
|
|
44
60
|
}
|
|
@@ -7,5 +7,5 @@ export interface UmbItemRepository<ItemType> extends UmbApi {
|
|
|
7
7
|
error?: UmbProblemDetails | undefined;
|
|
8
8
|
asObservable?: () => Observable<Array<ItemType>>;
|
|
9
9
|
}>;
|
|
10
|
-
items: (uniques: string[]) => Promise<Observable<Array<ItemType
|
|
10
|
+
items: (uniques: string[]) => Promise<Observable<Array<ItemType>> | undefined>;
|
|
11
11
|
}
|
|
@@ -93,9 +93,11 @@ let UmbRouterSlotElement = class UmbRouterSlotElement extends UmbLitElement {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
disconnectedCallback() {
|
|
96
|
-
super.disconnectedCallback();
|
|
97
96
|
window.removeEventListener('navigationsuccess', this._onNavigationChanged);
|
|
98
97
|
this.#listening = false;
|
|
98
|
+
// Close modals opened by this router slot.
|
|
99
|
+
this.#routeContext._internal_modalRouterChanged(undefined);
|
|
100
|
+
super.disconnectedCallback();
|
|
99
101
|
}
|
|
100
102
|
firstUpdated(_changedProperties) {
|
|
101
103
|
super.firstUpdated(_changedProperties);
|
|
@@ -105,6 +105,7 @@ export declare class RouterSlot<D = any, P = any> extends HTMLElement implements
|
|
|
105
105
|
* @param info
|
|
106
106
|
*/
|
|
107
107
|
notifyChildRouters<D = any>(info: IRoutingInfo<D>): void;
|
|
108
|
+
private getRedirectDelay;
|
|
108
109
|
/**
|
|
109
110
|
* Loads a new path based on the routes.
|
|
110
111
|
* Returns true if a navigation was made to a new page.
|
|
@@ -119,6 +119,8 @@ export class RouterSlot extends HTMLElement {
|
|
|
119
119
|
* Tears down the element.
|
|
120
120
|
*/
|
|
121
121
|
disconnectedCallback() {
|
|
122
|
+
this._setParent(null);
|
|
123
|
+
this._cancelNavigation?.();
|
|
122
124
|
this.detachListeners();
|
|
123
125
|
}
|
|
124
126
|
/**
|
|
@@ -238,6 +240,21 @@ export class RouterSlot extends HTMLElement {
|
|
|
238
240
|
});
|
|
239
241
|
}
|
|
240
242
|
}
|
|
243
|
+
getRedirectDelay() {
|
|
244
|
+
if ('connection' in navigator) {
|
|
245
|
+
const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
|
|
246
|
+
switch (connection.effectiveType) {
|
|
247
|
+
case 'slow-2g':
|
|
248
|
+
case '2g':
|
|
249
|
+
return 1200;
|
|
250
|
+
case '3g':
|
|
251
|
+
return 800;
|
|
252
|
+
case '4g':
|
|
253
|
+
return 200;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return 400;
|
|
257
|
+
}
|
|
241
258
|
/**
|
|
242
259
|
* Loads a new path based on the routes.
|
|
243
260
|
* Returns true if a navigation was made to a new page.
|
|
@@ -297,6 +314,19 @@ export class RouterSlot extends HTMLElement {
|
|
|
297
314
|
// Redirect if necessary
|
|
298
315
|
if (isRedirectRoute(route)) {
|
|
299
316
|
cleanup();
|
|
317
|
+
if (route.awaitStability === true) {
|
|
318
|
+
// await until browser is done loading, based on a guess:
|
|
319
|
+
const delay = this.getRedirectDelay();
|
|
320
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
321
|
+
if (navigationInvalidated) {
|
|
322
|
+
return cancel();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// Check if the current route is still matching the browser URL.:
|
|
326
|
+
if (!window.location.href.includes(this.constructAbsolutePath(''))) {
|
|
327
|
+
// If the parent is active, we should not redirect.
|
|
328
|
+
return cancel();
|
|
329
|
+
}
|
|
300
330
|
handleRedirect(this, route);
|
|
301
331
|
return false;
|
|
302
332
|
}
|
|
@@ -51,7 +51,7 @@ export declare abstract class UmbTreeRepositoryBase<TreeItemType extends UmbTree
|
|
|
51
51
|
asObservable?: undefined;
|
|
52
52
|
} | {
|
|
53
53
|
data: import("@umbraco-cms/backoffice/repository").UmbPagedModel<TreeItemType> | undefined;
|
|
54
|
-
error:
|
|
54
|
+
error: any;
|
|
55
55
|
asObservable: () => import("rxjs").Observable<TreeItemType[]>;
|
|
56
56
|
}>;
|
|
57
57
|
/**
|
|
@@ -62,6 +62,10 @@ export declare abstract class UmbTreeRepositoryBase<TreeItemType extends UmbTree
|
|
|
62
62
|
* @memberof UmbTreeRepositoryBase
|
|
63
63
|
*/
|
|
64
64
|
requestTreeItemsOf(args: TreeChildrenOfRequestArgsType): Promise<{
|
|
65
|
+
data?: undefined;
|
|
66
|
+
error?: undefined;
|
|
67
|
+
asObservable?: undefined;
|
|
68
|
+
} | {
|
|
65
69
|
data: import("@umbraco-cms/backoffice/repository").UmbPagedModel<TreeItemType> | undefined;
|
|
66
70
|
error: any;
|
|
67
71
|
asObservable: () => import("rxjs").Observable<TreeItemType[]>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository';
|
|
2
|
+
import { of } from '@umbraco-cms/backoffice/external/rxjs';
|
|
2
3
|
/**
|
|
3
4
|
* Base class for a tree repository.
|
|
4
5
|
* @abstract
|
|
@@ -21,10 +22,11 @@ export class UmbTreeRepositoryBase extends UmbRepositoryBase {
|
|
|
21
22
|
super(host);
|
|
22
23
|
this._treeSource = new treeSourceConstructor(this);
|
|
23
24
|
this._init = this.consumeContext(treeStoreContextAlias, (instance) => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
25
|
+
this._treeStore = instance;
|
|
26
|
+
})
|
|
27
|
+
.asPromise({ preventTimeout: true })
|
|
28
|
+
// Ignore the error, we can assume that the flow was stopped (asPromise failed), but it does not mean that the consumption was not successful.
|
|
29
|
+
.catch(() => undefined);
|
|
28
30
|
}
|
|
29
31
|
/**
|
|
30
32
|
* Requests root items of a tree
|
|
@@ -40,9 +42,9 @@ export class UmbTreeRepositoryBase extends UmbRepositoryBase {
|
|
|
40
42
|
return {};
|
|
41
43
|
}
|
|
42
44
|
if (data) {
|
|
43
|
-
this._treeStore
|
|
45
|
+
this._treeStore.appendItems(data.items);
|
|
44
46
|
}
|
|
45
|
-
// TODO:
|
|
47
|
+
// TODO: Fix the type of error, it should be UmbApiError, but currently it is any.
|
|
46
48
|
return { data, error: error, asObservable: () => this._treeStore.rootItems };
|
|
47
49
|
}
|
|
48
50
|
/**
|
|
@@ -60,12 +62,16 @@ export class UmbTreeRepositoryBase extends UmbRepositoryBase {
|
|
|
60
62
|
if (args.parent.entityType === null)
|
|
61
63
|
throw new Error('Parent entity type is missing');
|
|
62
64
|
await this._init;
|
|
63
|
-
const { data, error
|
|
64
|
-
|
|
65
|
+
const { data, error } = await this._treeSource.getChildrenOf(args);
|
|
66
|
+
if (!this._treeStore) {
|
|
67
|
+
// If the tree store is not available, then we most likely are in a destructed setting.
|
|
68
|
+
return {};
|
|
69
|
+
}
|
|
65
70
|
if (data) {
|
|
66
|
-
this._treeStore
|
|
71
|
+
this._treeStore.appendItems(data.items);
|
|
67
72
|
}
|
|
68
|
-
|
|
73
|
+
// TODO: Fix the type of error, it should be UmbApiError, but currently it is any.
|
|
74
|
+
return { data, error: error, asObservable: () => this._treeStore.childrenOf(args.parent.unique) };
|
|
69
75
|
}
|
|
70
76
|
/**
|
|
71
77
|
* Requests ancestors of a given item
|
|
@@ -77,10 +83,10 @@ export class UmbTreeRepositoryBase extends UmbRepositoryBase {
|
|
|
77
83
|
if (args.treeItem.unique === undefined)
|
|
78
84
|
throw new Error('Descendant unique is missing');
|
|
79
85
|
await this._init;
|
|
80
|
-
const { data, error
|
|
81
|
-
const error = _error;
|
|
86
|
+
const { data, error } = await this._treeSource.getAncestorsOf(args);
|
|
82
87
|
// TODO: implement observable for ancestor items in the store
|
|
83
|
-
|
|
88
|
+
// TODO: Fix the type of error, it should be UmbApiError, but currently it is any.
|
|
89
|
+
return { data, error: error };
|
|
84
90
|
}
|
|
85
91
|
/**
|
|
86
92
|
* Returns a promise with an observable of tree root items
|
|
@@ -89,6 +95,10 @@ export class UmbTreeRepositoryBase extends UmbRepositoryBase {
|
|
|
89
95
|
*/
|
|
90
96
|
async rootTreeItems() {
|
|
91
97
|
await this._init;
|
|
98
|
+
if (!this._treeStore) {
|
|
99
|
+
// If the tree store is not available, then we most likely are in a destructed setting.
|
|
100
|
+
return of([]);
|
|
101
|
+
}
|
|
92
102
|
return this._treeStore.rootItems;
|
|
93
103
|
}
|
|
94
104
|
/**
|
|
@@ -101,6 +111,10 @@ export class UmbTreeRepositoryBase extends UmbRepositoryBase {
|
|
|
101
111
|
if (parentUnique === undefined)
|
|
102
112
|
throw new Error('Parent unique is missing');
|
|
103
113
|
await this._init;
|
|
114
|
+
if (!this._treeStore) {
|
|
115
|
+
// If the tree store is not available, then we most likely are in a destructed setting.
|
|
116
|
+
return of([]);
|
|
117
|
+
}
|
|
104
118
|
return this._treeStore.childrenOf(parentUnique);
|
|
105
119
|
}
|
|
106
120
|
}
|
|
@@ -26,7 +26,7 @@ let UmbTreeItemElement = class UmbTreeItemElement extends UmbExtensionElementAnd
|
|
|
26
26
|
this.observe(
|
|
27
27
|
// TODO: what should we do if there are multiple tree items for an entity type?
|
|
28
28
|
// This method gets all extensions based on a type, then filters them based on the entity type. and then we get the alias of the first one [NL]
|
|
29
|
-
createObservablePart(umbExtensionsRegistry.byTypeAndFilter(this.getExtensionType(), filterByEntityType), (x) => x[0]
|
|
29
|
+
createObservablePart(umbExtensionsRegistry.byTypeAndFilter(this.getExtensionType(), filterByEntityType), (x) => x[0]?.alias), (alias) => {
|
|
30
30
|
this.alias = alias;
|
|
31
31
|
}, 'umbObserveAlias');
|
|
32
32
|
}
|
|
@@ -386,6 +386,7 @@ export class UmbValidationController extends UmbControllerBase {
|
|
|
386
386
|
this.#validators = [];
|
|
387
387
|
}
|
|
388
388
|
destroy() {
|
|
389
|
+
super.destroy();
|
|
389
390
|
this.#validationMode = false;
|
|
390
391
|
if (this.#inUnprovidingState === true) {
|
|
391
392
|
return;
|
|
@@ -400,6 +401,5 @@ export class UmbValidationController extends UmbControllerBase {
|
|
|
400
401
|
this.#localMessages = undefined;
|
|
401
402
|
this.#parentMessages = undefined;
|
|
402
403
|
this.#parent = undefined;
|
|
403
|
-
super.destroy();
|
|
404
404
|
}
|
|
405
405
|
}
|
package/dist-cms/packages/core/workspace/components/workspace-action/common/save/save.action.js
CHANGED
|
@@ -7,7 +7,9 @@ export class UmbSaveWorkspaceAction extends UmbWorkspaceActionBase {
|
|
|
7
7
|
this._workspaceContext = context;
|
|
8
8
|
this.#observeUnique();
|
|
9
9
|
this._gotWorkspaceContext();
|
|
10
|
-
})
|
|
10
|
+
})
|
|
11
|
+
.asPromise()
|
|
12
|
+
.catch(() => undefined);
|
|
11
13
|
}
|
|
12
14
|
#observeUnique() {
|
|
13
15
|
this.observe(this._workspaceContext?.unique, (unique) => {
|
|
@@ -45,9 +45,12 @@ let UmbWorkspaceVariantMenuBreadcrumbElement = class UmbWorkspaceVariantMenuBrea
|
|
|
45
45
|
#observeStructure() {
|
|
46
46
|
if (!this.#structureContext || !this.#workspaceContext)
|
|
47
47
|
return;
|
|
48
|
-
const isNew = this.#workspaceContext.getIsNew();
|
|
49
48
|
this.observe(this.#structureContext.structure, (value) => {
|
|
50
|
-
|
|
49
|
+
if (!this.#workspaceContext)
|
|
50
|
+
return;
|
|
51
|
+
const unique = this.#workspaceContext.getUnique();
|
|
52
|
+
// exclude the current unique from the structure. We append this with an observer of the name
|
|
53
|
+
this._structure = value.filter((structureItem) => structureItem.unique !== unique);
|
|
51
54
|
});
|
|
52
55
|
}
|
|
53
56
|
#observeDefaultCulture() {
|
|
@@ -477,8 +477,8 @@ let UmbWorkspaceSplitViewVariantSelectorElement = class UmbWorkspaceSplitViewVar
|
|
|
477
477
|
}
|
|
478
478
|
|
|
479
479
|
.switch-button:hover {
|
|
480
|
-
background: var(--uui-
|
|
481
|
-
color: var(--uui-
|
|
480
|
+
background: var(--uui-color-surface-emphasis);
|
|
481
|
+
color: var(--uui-color-interactive-emphasis);
|
|
482
482
|
}
|
|
483
483
|
.switch-button .variant-info {
|
|
484
484
|
flex-grow: 1;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
|
|
2
|
-
export const UMB_SUBMITTABLE_TREE_ENTITY_WORKSPACE_CONTEXT = new UmbContextToken('UmbWorkspaceContext', undefined, (context) => 'requestSubmit' in context && '
|
|
2
|
+
export const UMB_SUBMITTABLE_TREE_ENTITY_WORKSPACE_CONTEXT = new UmbContextToken('UmbWorkspaceContext', undefined, (context) => 'requestSubmit' in context && '_internal_createUnderParent' in context);
|
package/dist-cms/packages/core/workspace/controllers/workspace-is-new-redirect.controller.d.ts
CHANGED
|
@@ -13,5 +13,12 @@ export declare const UmbWorkspaceIsNewRedirectControllerAlias: unique symbol;
|
|
|
13
13
|
* @param router
|
|
14
14
|
*/
|
|
15
15
|
export declare class UmbWorkspaceIsNewRedirectController extends UmbControllerBase {
|
|
16
|
+
/**
|
|
17
|
+
* TODO: Figure out why we need this timeout. [NL]
|
|
18
|
+
* The problem this fixes it when save & publishing a document open in a modal, like from a collection.
|
|
19
|
+
* The redirect triggers something that ends up re-setting the path, making the modal path the one in the browser despite the modal is closed.
|
|
20
|
+
*/
|
|
21
|
+
timeout: any | undefined;
|
|
16
22
|
constructor(host: UmbControllerHost, workspaceContext: UmbSubmittableWorkspaceContextBase<unknown>, router: UmbRouterSlotElement);
|
|
23
|
+
destroy(): void;
|
|
17
24
|
}
|
package/dist-cms/packages/core/workspace/controllers/workspace-is-new-redirect.controller.js
CHANGED
|
@@ -15,20 +15,41 @@ export class UmbWorkspaceIsNewRedirectController extends UmbControllerBase {
|
|
|
15
15
|
super(host, UmbWorkspaceIsNewRedirectControllerAlias);
|
|
16
16
|
// Navigate to edit route when language is created:
|
|
17
17
|
this.observe(workspaceContext.isNew, (isNew) => {
|
|
18
|
+
if (this.timeout) {
|
|
19
|
+
clearTimeout(this.timeout);
|
|
20
|
+
}
|
|
18
21
|
if (isNew === false) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
id
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
this.timeout = setTimeout(() => {
|
|
23
|
+
const unique = workspaceContext.getUnique();
|
|
24
|
+
if (router && unique) {
|
|
25
|
+
const routerPath = router.absoluteRouterPath;
|
|
26
|
+
if (routerPath) {
|
|
27
|
+
const newPath = umbUrlPatternToString(ensurePathEndsWithSlash(routerPath) + 'edit/:id', {
|
|
28
|
+
id: unique,
|
|
29
|
+
});
|
|
30
|
+
this.destroy();
|
|
31
|
+
// get current url:
|
|
32
|
+
const currentUrl = window.location.href;
|
|
33
|
+
if (router.localActiveViewPath === undefined ||
|
|
34
|
+
router.localActiveViewPath === '' ||
|
|
35
|
+
!currentUrl.includes(router.localActiveViewPath)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Check that we are still part of the DOM and thereby relevant:
|
|
39
|
+
window.history.replaceState(null, '', newPath);
|
|
40
|
+
}
|
|
28
41
|
}
|
|
29
|
-
|
|
42
|
+
this.timeout = undefined;
|
|
43
|
+
}, 500);
|
|
30
44
|
}
|
|
31
45
|
});
|
|
32
46
|
// TODO: If workspace route changes cause of other reasons then this controller should be destroyed.
|
|
33
47
|
}
|
|
48
|
+
destroy() {
|
|
49
|
+
super.destroy();
|
|
50
|
+
if (this.timeout) {
|
|
51
|
+
clearTimeout(this.timeout);
|
|
52
|
+
this.timeout = undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
34
55
|
}
|
|
@@ -22,13 +22,13 @@ export class UmbWorkspaceRouteManager extends UmbControllerBase {
|
|
|
22
22
|
* @memberof UmbWorkspaceRouteManager
|
|
23
23
|
*/
|
|
24
24
|
setRoutes(routes) {
|
|
25
|
-
const allRoutes = [
|
|
26
|
-
|
|
27
|
-
{
|
|
25
|
+
const allRoutes = [...routes];
|
|
26
|
+
if (routes.length > 0) {
|
|
27
|
+
allRoutes.push({
|
|
28
28
|
path: `**`,
|
|
29
29
|
component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement,
|
|
30
|
-
}
|
|
31
|
-
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
32
|
const mappedRoutes = allRoutes.map((route) => {
|
|
33
33
|
// override the setup method to set the active local path
|
|
34
34
|
const oldSetupCallback = route.setup;
|
|
@@ -329,6 +329,7 @@ export class UmbEntityDetailWorkspaceContextBase extends UmbSubmittableWorkspace
|
|
|
329
329
|
this.#entityContext.setUnique(data.unique);
|
|
330
330
|
this._data.setPersisted(data);
|
|
331
331
|
this._data.setCurrent(data);
|
|
332
|
+
this.setIsNew(false);
|
|
332
333
|
const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT);
|
|
333
334
|
if (!eventContext)
|
|
334
335
|
throw new Error('Event context not found.');
|
|
@@ -337,7 +338,6 @@ export class UmbEntityDetailWorkspaceContextBase extends UmbSubmittableWorkspace
|
|
|
337
338
|
unique: parent.unique,
|
|
338
339
|
});
|
|
339
340
|
eventContext.dispatchEvent(event);
|
|
340
|
-
this.setIsNew(false);
|
|
341
341
|
}
|
|
342
342
|
async _update(currentData) {
|
|
343
343
|
const { error, data } = await this._detailRepository.save(currentData);
|
package/dist-cms/packages/core/workspace/submittable/submittable-workspace-context-base.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export declare abstract class UmbSubmittableWorkspaceContextBase<WorkspaceDataMo
|
|
|
37
37
|
abstract getData(): WorkspaceDataModelType | undefined;
|
|
38
38
|
protected abstract submit(): Promise<void>;
|
|
39
39
|
protected invalidSubmit(reason?: any): Promise<void>;
|
|
40
|
+
destroy(): void;
|
|
40
41
|
}
|
|
41
42
|
export declare abstract class UmbEditableWorkspaceContextBase<WorkspaceDataModelType> extends UmbSubmittableWorkspaceContextBase<WorkspaceDataModelType> {
|
|
42
43
|
}
|
|
@@ -112,6 +112,16 @@ export class UmbSubmittableWorkspaceContextBase extends UmbContextBase {
|
|
|
112
112
|
invalidSubmit(reason) {
|
|
113
113
|
return Promise.reject(reason);
|
|
114
114
|
}
|
|
115
|
+
destroy() {
|
|
116
|
+
this.#isNew.destroy();
|
|
117
|
+
this.routes.destroy();
|
|
118
|
+
super.destroy();
|
|
119
|
+
this.#submitPromise = undefined;
|
|
120
|
+
this.#submitResolve = undefined;
|
|
121
|
+
this.#submitReject = undefined;
|
|
122
|
+
this.#validationContexts.forEach((context) => context.destroy());
|
|
123
|
+
this.#validationContexts = [];
|
|
124
|
+
}
|
|
115
125
|
}
|
|
116
126
|
/*
|
|
117
127
|
* @deprecated Use UmbSubmittableWorkspaceContextBase instead — Will be removed before RC.
|
package/dist-cms/packages/data-type/collection/repository/data-type-collection.repository.js
CHANGED
|
@@ -11,7 +11,12 @@ export class UmbDataTypeCollectionRepository extends UmbRepositoryBase {
|
|
|
11
11
|
if (instance) {
|
|
12
12
|
this.#itemStore = instance;
|
|
13
13
|
}
|
|
14
|
-
})
|
|
14
|
+
})
|
|
15
|
+
.asPromise({ preventTimeout: true })
|
|
16
|
+
.catch(() => {
|
|
17
|
+
// If the context is not available, we can assume that the store is not available.
|
|
18
|
+
this.#itemStore = undefined;
|
|
19
|
+
});
|
|
15
20
|
this.#collectionSource = new UmbDataTypeCollectionServerDataSource(host);
|
|
16
21
|
}
|
|
17
22
|
async requestCollection(query) {
|
|
@@ -8,7 +8,12 @@ export class UmbDataTypeDetailRepository extends UmbDetailRepositoryBase {
|
|
|
8
8
|
super(host, UmbDataTypeServerDataSource, UMB_DATA_TYPE_DETAIL_STORE_CONTEXT);
|
|
9
9
|
this.#init = this.consumeContext(UMB_DATA_TYPE_DETAIL_STORE_CONTEXT, (instance) => {
|
|
10
10
|
this.#detailStore = instance;
|
|
11
|
-
})
|
|
11
|
+
})
|
|
12
|
+
.asPromise({ preventTimeout: true })
|
|
13
|
+
.catch(() => {
|
|
14
|
+
// If the context is not available, we can assume that the store is not available.
|
|
15
|
+
this.#detailStore = undefined;
|
|
16
|
+
});
|
|
12
17
|
}
|
|
13
18
|
async byPropertyEditorUiAlias(propertyEditorUiAlias) {
|
|
14
19
|
if (!propertyEditorUiAlias)
|
|
@@ -74,13 +74,14 @@ let UmbDocumentBlueprintWorkspaceEditorElement = class UmbDocumentBlueprintWorks
|
|
|
74
74
|
// Using first single view as the default route for now (hence the math below):
|
|
75
75
|
routes.push({
|
|
76
76
|
path: '',
|
|
77
|
+
pathMatch: 'full',
|
|
77
78
|
redirectTo: routes[variants.length * variants.length]?.path,
|
|
78
79
|
});
|
|
80
|
+
routes.push({
|
|
81
|
+
path: `**`,
|
|
82
|
+
component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement,
|
|
83
|
+
});
|
|
79
84
|
}
|
|
80
|
-
routes.push({
|
|
81
|
-
path: `**`,
|
|
82
|
-
component: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement,
|
|
83
|
-
});
|
|
84
85
|
this._routes = routes;
|
|
85
86
|
}
|
|
86
87
|
render() {
|
|
@@ -46,10 +46,20 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase {
|
|
|
46
46
|
this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, async (context) => {
|
|
47
47
|
this.#documentWorkspaceContext = context;
|
|
48
48
|
this.#initPendingChanges();
|
|
49
|
-
})
|
|
49
|
+
})
|
|
50
|
+
.asPromise({ preventTimeout: true })
|
|
51
|
+
.catch(() => {
|
|
52
|
+
// If the context is not available, we can assume that the context is not available.
|
|
53
|
+
this.#documentWorkspaceContext = undefined;
|
|
54
|
+
}),
|
|
50
55
|
this.consumeContext(UMB_ACTION_EVENT_CONTEXT, async (context) => {
|
|
51
56
|
this.#eventContext = context;
|
|
52
|
-
})
|
|
57
|
+
})
|
|
58
|
+
.asPromise({ preventTimeout: true })
|
|
59
|
+
.catch(() => {
|
|
60
|
+
// If the context is not available, we can assume that the context is not available.
|
|
61
|
+
this.#eventContext = undefined;
|
|
62
|
+
}),
|
|
53
63
|
]);
|
|
54
64
|
this.consumeContext(UMB_NOTIFICATION_CONTEXT, (context) => {
|
|
55
65
|
this.#notificationContext = context;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UMB_PROPERTY_TYPE_BASED_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/content';
|
|
2
2
|
import { UmbDefaultTreeContext } from '@umbraco-cms/backoffice/tree';
|
|
3
3
|
export class UmbDocumentTreeContext extends UmbDefaultTreeContext {
|
|
4
4
|
constructor(host) {
|
|
5
5
|
super(host);
|
|
6
|
-
this.consumeContext(
|
|
6
|
+
this.consumeContext(UMB_PROPERTY_TYPE_BASED_PROPERTY_CONTEXT, (context) => {
|
|
7
7
|
this.observe(context?.dataType, (value) => {
|
|
8
8
|
this.updateAdditionalRequestArgs({ dataType: value });
|
|
9
9
|
});
|
|
@@ -12,6 +12,7 @@ export type * from './modals/types.js';
|
|
|
12
12
|
export type * from './publishing/types.js';
|
|
13
13
|
export type * from './recycle-bin/types.js';
|
|
14
14
|
export type * from './tree/types.js';
|
|
15
|
+
export type * from './url/types.js';
|
|
15
16
|
export type * from './user-permissions/types.js';
|
|
16
17
|
export type * from './workspace/types.js';
|
|
17
18
|
export interface UmbDocumentDetailModel extends UmbContentDetailModel {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type * from './repository/types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -19,8 +19,10 @@ export class UmbDocumentUserPermissionCondition extends UmbConditionBase {
|
|
|
19
19
|
}, 'umbUserPermissionConditionObserver');
|
|
20
20
|
});
|
|
21
21
|
this.consumeContext(UMB_ENTITY_CONTEXT, (context) => {
|
|
22
|
-
if (!context)
|
|
22
|
+
if (!context) {
|
|
23
|
+
this.removeUmbControllerByAlias('umbUserPermissionEntityContextObserver');
|
|
23
24
|
return;
|
|
25
|
+
}
|
|
24
26
|
this.observe(observeMultiple([context.entityType, context.unique]), ([entityType, unique]) => {
|
|
25
27
|
this.#entityType = entityType;
|
|
26
28
|
this.#unique = unique;
|
|
@@ -7,9 +7,11 @@ export class UmbDocumentSaveWorkspaceAction extends UmbSaveWorkspaceAction {
|
|
|
7
7
|
}
|
|
8
8
|
async hasAdditionalOptions() {
|
|
9
9
|
await this._retrieveWorkspaceContext;
|
|
10
|
-
const variantOptions = await this.observe(this._workspaceContext.variantOptions)
|
|
10
|
+
const variantOptions = await this.observe(this._workspaceContext.variantOptions)
|
|
11
|
+
.asPromise()
|
|
12
|
+
.catch(() => undefined);
|
|
11
13
|
const cultureVariantOptions = variantOptions?.filter((option) => option.culture);
|
|
12
|
-
return cultureVariantOptions?.length > 1;
|
|
14
|
+
return cultureVariantOptions ? cultureVariantOptions?.length > 1 : false;
|
|
13
15
|
}
|
|
14
16
|
_gotWorkspaceContext() {
|
|
15
17
|
super._gotWorkspaceContext();
|