@@ -157,7 +157,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement {
}
private _disableRedirectHandler() {
- const modalHandler = this._modalService?.confirm({
+ const modalHandler = this._modalContext?.confirm({
headline: 'Disable URL tracker',
content: html`Are you sure you want to disable the URL tracker?`,
color: 'danger',
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts
index 1e27078ee3..c847dbb2cb 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts
@@ -4,32 +4,25 @@ import { ArrayState } from '@umbraco-cms/observable-api';
import { UmbStoreBase } from '@umbraco-cms/store';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
-
-export const UMB_DocumentBlueprint_DETAIL_STORE_CONTEXT_TOKEN = new UmbContextToken
('UmbDocumentBlueprintDetailStore');
-
-
/**
* @export
- * @class UmbDocumentBlueprintDetailStore
+ * @class UmbDocumentBlueprintStore
* @extends {UmbStoreBase}
- * @description - Details Data Store for Document Blueprints
+ * @description - Data Store for Document Blueprints
*/
-export class UmbDocumentBlueprintDetailStore extends UmbStoreBase {
-
-
+export class UmbDocumentBlueprintStore extends UmbStoreBase {
// TODO: use the right type:
#data = new ArrayState([], (x) => x.key);
-
constructor(host: UmbControllerHostInterface) {
- super(host, UMB_DocumentBlueprint_DETAIL_STORE_CONTEXT_TOKEN.toString());
+ super(host, UMB_DOCUMENT_BLUEPRINT_STORE_CONTEXT_TOKEN.toString());
}
/**
* @description - Request a Data Type by key. The Data Type is added to the store and is returned as an Observable.
* @param {string} key
* @return {*} {(Observable)}
- * @memberof UmbDocumentBlueprintDetailStore
+ * @memberof UmbDocumentBlueprintStore
*/
getByKey(key: string) {
// TODO: use backend cli when available.
@@ -39,21 +32,18 @@ export class UmbDocumentBlueprintDetailStore extends UmbStoreBase {
this.#data.append(data);
});
- return this.#data.getObservablePart((documents) =>
- documents.find((document) => document.key === key)
- );
+ return this.#data.getObservablePart((documents) => documents.find((document) => document.key === key));
}
getScaffold(entityType: string, parentKey: string | null) {
- return {
- } as DocumentBlueprintDetails;
+ return {} as DocumentBlueprintDetails;
}
// TODO: make sure UI somehow can follow the status of this action.
/**
* @description - Save a DocumentBlueprint.
* @param {Array} Dictionaries
- * @memberof UmbDocumentBlueprintDetailStore
+ * @memberof UmbDocumentBlueprintStore
* @return {*} {Promise}
*/
save(data: DocumentBlueprintDetails[]) {
@@ -86,7 +76,7 @@ export class UmbDocumentBlueprintDetailStore extends UmbStoreBase {
/**
* @description - Delete a Data Type.
* @param {string[]} keys
- * @memberof UmbDocumentBlueprintDetailStore
+ * @memberof UmbDocumentBlueprintStore
* @return {*} {Promise}
*/
async delete(keys: string[]) {
@@ -102,3 +92,7 @@ export class UmbDocumentBlueprintDetailStore extends UmbStoreBase {
this.#data.remove(keys);
}
}
+
+export const UMB_DOCUMENT_BLUEPRINT_STORE_CONTEXT_TOKEN = new UmbContextToken(
+ 'UmbDocumentBlueprintStore'
+);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.tree.store.ts
index 89759657aa..08aa3e6b3e 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.tree.store.ts
@@ -1,11 +1,8 @@
-import { DocumentBlueprintResource, DocumentTreeItemModel } from '@umbraco-cms/backend-api';
-import { tryExecuteAndNotify } from '@umbraco-cms/resources';
import { UmbContextToken } from '@umbraco-cms/context-api';
-import { ArrayState } from '@umbraco-cms/observable-api';
-import { UmbStoreBase } from '@umbraco-cms/store';
+import { UmbTreeStoreBase } from '@umbraco-cms/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/controller';
-export const UMB_DocumentBlueprint_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
+export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
'UmbDocumentBlueprintTreeStore'
);
@@ -15,81 +12,8 @@ export const UMB_DocumentBlueprint_TREE_STORE_CONTEXT_TOKEN = new UmbContextToke
* @extends {UmbStoreBase}
* @description - Tree Data Store for Document Blueprints
*/
-export class UmbDocumentBlueprintTreeStore extends UmbStoreBase {
- #data = new ArrayState([], (x) => x.key);
-
+export class UmbDocumentBlueprintTreeStore extends UmbTreeStoreBase {
constructor(host: UmbControllerHostInterface) {
- super(host, UMB_DocumentBlueprint_TREE_STORE_CONTEXT_TOKEN.toString());
- }
-
- // TODO: How can we avoid having this in both stores?
- /**
- * @description - Delete a Document Blueprint Type.
- * @param {string[]} keys
- * @memberof UmbDocumentBlueprintsStore
- * @return {*} {Promise}
- */
- async delete(keys: string[]) {
- // TODO: use backend cli when available.
- await fetch('/umbraco/backoffice/data-type/delete', {
- method: 'POST',
- body: JSON.stringify(keys),
- headers: {
- 'Content-Type': 'application/json',
- },
- });
-
- this.#data.remove(keys);
- }
-
- getTreeRoot() {
- tryExecuteAndNotify(this._host, DocumentBlueprintResource.getTreeDocumentBlueprintRoot({})).then(({ data }) => {
- if (data) {
- // TODO: how do we handle if an item has been removed during this session(like in another tab or by another user)?
- this.#data.append(data.items);
- }
- });
-
- // TODO: how do we handle trashed items?
- // TODO: remove ignore when we know how to handle trashed items.
- return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === null && !item.isTrashed));
- }
-
- getTreeItemChildren(key: string) {
- /*
- tryExecuteAndNotify(
- this._host,
- DocumentBlueprintResource.getTreeDocumentBlueprintChildren({
- parentKey: key,
- })
- ).then(({ data }) => {
- if (data) {
- // TODO: how do we handle if an item has been removed during this session(like in another tab or by another user)?
- this.#data.append(data.items);
- }
- });
- */
-
- // TODO: how do we handle trashed items?
- // TODO: remove ignore when we know how to handle trashed items.
- return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === key && !item.isTrashed));
- }
-
- getTreeItems(keys: Array) {
- if (keys?.length > 0) {
- tryExecuteAndNotify(
- this._host,
- DocumentBlueprintResource.getTreeDocumentBlueprintItem({
- key: keys,
- })
- ).then(({ data }) => {
- if (data) {
- // TODO: how do we handle if an item has been removed during this session(like in another tab or by another user)?
- this.#data.append(data);
- }
- });
- }
-
- return this.#data.getObservablePart((items) => items.filter((item) => keys.includes(item.key ?? '')));
+ super(host, UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN.toString());
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/manifests.ts
index 5bee1cd866..4b80c03dbb 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/manifests.ts
@@ -1,4 +1,24 @@
+import { UmbDocumentBlueprintStore } from './document-blueprint.detail.store';
+import { UmbDocumentBlueprintTreeStore } from './document-blueprint.tree.store';
import { manifests as menuItemManifests } from './menu-item/manifests';
import { manifests as workspaceManifests } from './workspace/manifests';
+import type { ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
-export const manifests = [...menuItemManifests, ...workspaceManifests];
+export const DOCUMENT_BLUEPRINT_STORE_ALIAS = 'Umb.Store.DocumentBlueprint';
+export const DOCUMENT_BLUEPRINT_TREE_STORE_ALIAS = 'Umb.Store.DocumentBlueprintTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: DOCUMENT_BLUEPRINT_STORE_ALIAS,
+ name: 'Document Blueprint Store',
+ class: UmbDocumentBlueprintStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: DOCUMENT_BLUEPRINT_TREE_STORE_ALIAS,
+ name: 'Document Blueprint Tree Store',
+ class: UmbDocumentBlueprintTreeStore,
+};
+
+export const manifests = [store, treeStore, ...menuItemManifests, ...workspaceManifests];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts
index 085cd78f5e..683880d36e 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts
@@ -8,7 +8,7 @@ import { UmbContextConsumerController } from '@umbraco-cms/context-api';
import { ProblemDetailsModel, DocumentTypeModel } from '@umbraco-cms/backend-api';
import type { UmbTreeRepository } from 'libs/repository/tree-repository.interface';
import { UmbDetailRepository } from '@umbraco-cms/repository';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
type ItemType = DocumentTypeModel;
@@ -27,7 +27,7 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, UmbDetailRe
#detailDataSource: UmbDocumentTypeServerDataSource;
#detailStore?: UmbDocumentTypeStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -45,8 +45,8 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, UmbDetailRe
this.#detailStore = instance;
}),
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
}),
]);
}
@@ -159,7 +159,7 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, UmbDetailRe
if (!error) {
const notification = { data: { message: `Document created` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
@@ -181,7 +181,7 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, UmbDetailRe
if (!error) {
const notification = { data: { message: `Document saved` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
@@ -207,7 +207,7 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, UmbDetailRe
if (!error) {
const notification = { data: { message: `Document deleted` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts
index 1906d62454..7b38c47233 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts
@@ -19,7 +19,7 @@ export class UmbDocumentTypeStore extends UmbStoreBase {
* @memberof UmbDocumentTypeStore
*/
constructor(host: UmbControllerHostInterface) {
- super(host, UmbDocumentTypeStore.name);
+ super(host, UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN.toString());
}
/**
@@ -51,5 +51,5 @@ export class UmbDocumentTypeStore extends UmbStoreBase {
}
export const UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbDocumentTypeStore.name
+ 'UmbDocumentTypeStore'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.tree.store.ts
index b18c51f11a..0f1e5b38ca 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.tree.store.ts
@@ -21,5 +21,5 @@ export class UmbDocumentTypeTreeStore extends UmbTreeStoreBase {
}
export const UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbDocumentTypeTreeStore.name
+ 'UmbDocumentTypeTreeStore'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/manifests.ts
index 89c4abbb74..5a6bf52874 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/manifests.ts
@@ -1,7 +1,9 @@
import { UmbDocumentTypeRepository } from './document-type.repository';
-import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { UmbDocumentTypeStore } from './document-type.store';
+import { UmbDocumentTypeTreeStore } from './document-type.tree.store';
+import { ManifestRepository, ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
-export const DOCUMENT_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentTypes';
+export const DOCUMENT_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentType';
const repository: ManifestRepository = {
type: 'repository',
@@ -10,4 +12,21 @@ const repository: ManifestRepository = {
class: UmbDocumentTypeRepository,
};
-export const manifests = [repository];
+export const DOCUMENT_TYPE_STORE_ALIAS = 'Umb.Store.DocumentType';
+export const DOCUMENT_TYPE_TREE_STORE_ALIAS = 'Umb.Store.DocumentTypeTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: DOCUMENT_TYPE_STORE_ALIAS,
+ name: 'Document Type Store',
+ class: UmbDocumentTypeStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: DOCUMENT_TYPE_TREE_STORE_ALIAS,
+ name: 'Document Type Tree Store',
+ class: UmbDocumentTypeTreeStore,
+};
+
+export const manifests = [repository, store, treeStore];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/tree/manifests.ts
index 8ad6905dc3..1a2876f55f 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/tree/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/tree/manifests.ts
@@ -1,5 +1,5 @@
import { UmbDocumentTypeRepository } from '../repository/document-type.repository';
-import type { ManifestTree, ManifestTreeItemAction } from '@umbraco-cms/models';
+import type { ManifestTree } from '@umbraco-cms/models';
const tree: ManifestTree = {
type: 'tree',
@@ -10,6 +10,4 @@ const tree: ManifestTree = {
},
};
-const treeItemActions: Array = [];
-
-export const manifests = [tree, ...treeItemActions];
+export const manifests = [tree];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts
index bc9ff169a6..fd5c9537ea 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts
@@ -6,7 +6,7 @@ import type { UmbWorkspaceEntityElement } from '../../../shared/components/works
import { UmbWorkspaceDocumentTypeContext } from './document-type-workspace.context';
import type { DocumentTypeModel } from '@umbraco-cms/backend-api';
import { UmbLitElement } from '@umbraco-cms/element';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/modal';
@customElement('umb-document-type-workspace')
export class UmbDocumentTypeWorkspaceElement extends UmbLitElement implements UmbWorkspaceEntityElement {
@@ -51,13 +51,13 @@ export class UmbDocumentTypeWorkspaceElement extends UmbLitElement implements Um
@state()
private _documentType?: DocumentTypeModel;
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => {
- this._modalService = instance;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
});
this.observe(this._workspaceContext.data, (data) => {
@@ -86,7 +86,7 @@ export class UmbDocumentTypeWorkspaceElement extends UmbLitElement implements Um
}
private async _handleIconClick() {
- const modalHandler = this._modalService?.iconPicker();
+ const modalHandler = this._modalContext?.iconPicker();
modalHandler?.onClose().then((saved) => {
if (saved) this._workspaceContext?.setIcon(saved.icon);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/manifests.ts
index 7dc878c0b6..c6c3515380 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/manifests.ts
@@ -1,3 +1,4 @@
+import { DOCUMENT_REPOSITORY_ALIAS } from '../repository/manifests';
import { UmbCreateDocumentEntityAction } from './create.action';
import { UmbPublishDocumentEntityAction } from './publish.action';
import { UmbDocumentCultureAndHostnamesEntityAction } from './culture-and-hostnames.action';
@@ -15,7 +16,6 @@ import {
import { ManifestEntityAction } from '@umbraco-cms/extensions-registry';
const entityType = 'document';
-const repositoryAlias = 'Umb.Repository.Documents';
const entityActions: Array = [
{
@@ -27,7 +27,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:add',
label: 'Create',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbCreateDocumentEntityAction,
},
},
@@ -40,7 +40,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:trash',
label: 'Trash',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbTrashEntityAction,
},
},
@@ -53,7 +53,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:blueprint',
label: 'Create Content Template',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbCreateDocumentBlueprintEntityAction,
},
},
@@ -66,7 +66,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:enter',
label: 'Move',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbMoveEntityAction,
},
},
@@ -79,7 +79,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:documents',
label: 'Copy',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbCopyEntityAction,
},
},
@@ -92,7 +92,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:navigation-vertical',
label: 'Sort',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbSortChildrenOfEntityAction,
},
},
@@ -105,7 +105,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:home',
label: 'Culture And Hostnames',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbDocumentCultureAndHostnamesEntityAction,
},
},
@@ -117,7 +117,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:vcard',
label: 'Permissions',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbDocumentPermissionsEntityAction,
},
},
@@ -129,7 +129,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:lock',
label: 'Public Access',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbDocumentPublicAccessEntityAction,
},
},
@@ -141,19 +141,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:globe',
label: 'Publish',
- repositoryAlias,
- api: UmbPublishDocumentEntityAction,
- },
- },
- {
- type: 'entityAction',
- alias: 'Umb.EntityAction.Document.Publish',
- name: 'Publish Document Entity Action',
- meta: {
- entityType,
- icon: 'umb:globe',
- label: 'Publish',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbPublishDocumentEntityAction,
},
},
@@ -165,7 +153,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:globe',
label: 'Unpublish',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbUnpublishDocumentEntityAction,
},
},
@@ -177,7 +165,7 @@ const entityActions: Array = [
entityType,
icon: 'umb:undo',
label: 'Rollback',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbRollbackDocumentEntityAction,
},
},
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/manifests.ts
index 10da47405a..7edd0952e3 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/manifests.ts
@@ -1,9 +1,9 @@
+import { DOCUMENT_REPOSITORY_ALIAS } from '../repository/manifests';
import { UmbDocumentMoveEntityBulkAction } from './move/move.action';
import { UmbDocumentCopyEntityBulkAction } from './copy/copy.action';
import { ManifestEntityBulkAction } from '@umbraco-cms/extensions-registry';
const entityType = 'document';
-const repositoryAlias = 'Umb.Repository.Documents';
const entityActions: Array = [
{
@@ -14,7 +14,7 @@ const entityActions: Array = [
meta: {
entityType,
label: 'Move',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbDocumentMoveEntityBulkAction,
},
},
@@ -26,7 +26,7 @@ const entityActions: Array = [
meta: {
entityType,
label: 'Copy',
- repositoryAlias,
+ repositoryAlias: DOCUMENT_REPOSITORY_ALIAS,
api: UmbDocumentCopyEntityBulkAction,
},
},
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts
index 7e0188a602..104b9092df 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts
@@ -1,14 +1,14 @@
import type { RepositoryTreeDataSource } from '../../../../../libs/repository/repository-tree-data-source.interface';
import { DocumentTreeServerDataSource } from './sources/document.tree.server.data';
import { UmbDocumentTreeStore, UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN } from './document.tree.store';
-import { UmbDocumentStore, UMB_DOCUMENT_DETAIL_STORE_CONTEXT_TOKEN } from './document.store';
+import { UmbDocumentStore, UMB_DOCUMENT_STORE_CONTEXT_TOKEN } from './document.store';
import { UmbDocumentServerDataSource } from './sources/document.server.data';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
import { ProblemDetailsModel, DocumentModel } from '@umbraco-cms/backend-api';
import type { UmbTreeRepository } from 'libs/repository/tree-repository.interface';
import { UmbDetailRepository } from '@umbraco-cms/repository';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
type ItemType = DocumentModel;
@@ -25,9 +25,9 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi
#treeStore?: UmbDocumentTreeStore;
#detailDataSource: UmbDocumentServerDataSource;
- #detailStore?: UmbDocumentStore;
+ #store?: UmbDocumentStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -41,12 +41,12 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi
this.#treeStore = instance;
}),
- new UmbContextConsumerController(this.#host, UMB_DOCUMENT_DETAIL_STORE_CONTEXT_TOKEN, (instance) => {
- this.#detailStore = instance;
+ new UmbContextConsumerController(this.#host, UMB_DOCUMENT_STORE_CONTEXT_TOKEN, (instance) => {
+ this.#store = instance;
}),
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
}),
]);
}
@@ -135,7 +135,7 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi
const { data, error } = await this.#detailDataSource.get(key);
if (data) {
- this.#detailStore?.append(data);
+ this.#store?.append(data);
}
return { data, error };
@@ -154,12 +154,12 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi
if (!error) {
const notification = { data: { message: `Document created` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server
- this.#detailStore?.append(item);
+ this.#store?.append(item);
// TODO: Update tree store with the new item? or ask tree to request the new item?
return { error };
@@ -176,13 +176,13 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi
if (!error) {
const notification = { data: { message: `Document saved` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server
// Consider notify a workspace if a document is updated in the store while someone is editing it.
- this.#detailStore?.append(item);
+ this.#store?.append(item);
//this.#treeStore?.updateItem(item.key, { name: item.name });// Port data to tree store.
// TODO: would be nice to align the stores on methods/methodNames.
@@ -202,13 +202,13 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi
if (!error) {
const notification = { data: { message: `Document deleted` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server.
// Consider notify a workspace if a document is deleted from the store while someone is editing it.
- this.#detailStore?.remove([key]);
+ this.#store?.remove([key]);
this.#treeStore?.removeItem(key);
// TODO: would be nice to align the stores on methods/methodNames.
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts
index 274ef33130..0dfd392794 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts
@@ -19,7 +19,7 @@ export class UmbDocumentStore extends UmbStoreBase {
* @memberof UmbDocumentDetailStore
*/
constructor(host: UmbControllerHostInterface) {
- super(host, UmbDocumentStore.name);
+ super(host, UMB_DOCUMENT_STORE_CONTEXT_TOKEN.toString());
}
/**
@@ -50,4 +50,4 @@ export class UmbDocumentStore extends UmbStoreBase {
}
}
-export const UMB_DOCUMENT_DETAIL_STORE_CONTEXT_TOKEN = new UmbContextToken(UmbDocumentStore.name);
+export const UMB_DOCUMENT_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDocumentStore');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.tree.store.ts
index 8cc4cd5aa3..71a563ed34 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.tree.store.ts
@@ -20,5 +20,5 @@ export class UmbDocumentTreeStore extends UmbTreeStoreBase {
}
export const UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbDocumentTreeStore.name
+ 'UmbDocumentTreeStore'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/manifests.ts
index 9df7f79d54..da7a9197b2 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/manifests.ts
@@ -1,7 +1,10 @@
import { UmbDocumentRepository } from '../repository/document.repository';
+import { UmbDocumentStore } from './document.store';
+import { UmbDocumentTreeStore } from './document.tree.store';
import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
-export const DOCUMENT_REPOSITORY_ALIAS = 'Umb.Repository.Documents';
+export const DOCUMENT_REPOSITORY_ALIAS = 'Umb.Repository.Document';
const repository: ManifestRepository = {
type: 'repository',
@@ -10,4 +13,21 @@ const repository: ManifestRepository = {
class: UmbDocumentRepository,
};
-export const manifests = [repository];
+export const DOCUMENT_STORE_ALIAS = 'Umb.Store.Document';
+export const DOCUMENT_TREE_STORE_ALIAS = 'Umb.Store.DocumentTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: DOCUMENT_STORE_ALIAS,
+ name: 'Document Store',
+ class: UmbDocumentStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: DOCUMENT_TREE_STORE_ALIAS,
+ name: 'Document Tree Store',
+ class: UmbDocumentTreeStore,
+};
+
+export const manifests = [repository, store, treeStore];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-create.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-create.element.ts
deleted file mode 100644
index 0f5c499ef0..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-create.element.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { UUITextStyles } from '@umbraco-ui/uui-css';
-import { css, html } from 'lit';
-import { customElement } from 'lit/decorators.js';
-import UmbTreeItemActionElement from '../../../../shared/components/tree/action/tree-item-action.element';
-
-@customElement('umb-tree-action-document-create')
-export default class UmbTreeActionDocumentCreateElement extends UmbTreeItemActionElement {
- static styles = [UUITextStyles, css``];
-
- // TODO: how do we handle the href?
- private _constructUrl() {
- return `/section/content/${this._activeTreeItem?.type}/${this._activeTreeItem?.key}/view/content?create=true`;
- }
-
- // TODO: change to href. This is a temporary solution to get the link to work. For some reason query params gets removed when using href.
- private _handleLabelClick() {
- if (!this._treeContextMenuService) return;
- const href = this._constructUrl();
- history.pushState(null, '', href);
- this._treeContextMenuService.close();
- }
-
- render() {
- return html`
-
- `;
- }
-}
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-tree-action-document-create': UmbTreeActionDocumentCreateElement;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged-page-2.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged-page-2.element.ts
deleted file mode 100644
index 4952dc0662..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged-page-2.element.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { UUITextStyles } from '@umbraco-ui/uui-css';
-import { css, html } from 'lit';
-import { customElement } from 'lit/decorators.js';
-import UmbTreeItemActionElement from '../../../../shared/components/tree/action/tree-item-action.element';
-
-@customElement('umb-tree-action-create-page-2')
-export class UmbTreeActionCreatePage2Element extends UmbTreeItemActionElement {
- static styles = [UUITextStyles, css``];
-
- private _save() {
- this._treeContextMenuService?.close();
- }
-
- private _back() {
- this._actionPageService?.closeTopPage();
- }
-
- render() {
- return html`Create page 2 for entity: ${this._entity.name}
- This is the last create page, here you can go back og save (it just closes the modal for now)
-
- `;
- }
-}
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-tree-action-create-page-2': UmbTreeActionCreatePage2Element;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged-page.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged-page.element.ts
deleted file mode 100644
index 671ff95124..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged-page.element.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { UUITextStyles } from '@umbraco-ui/uui-css';
-import { css, html } from 'lit';
-import { customElement } from 'lit/decorators.js';
-import UmbTreeItemActionElement from '../../../../shared/components/tree/action/tree-item-action.element';
-
-@customElement('umb-tree-action-create-page')
-export class UmbTreeActionCreatePageElement extends UmbTreeItemActionElement {
- static styles = [UUITextStyles, css``];
-
- private _next() {
- this._actionPageService?.openPage('umb-tree-action-create-page-2');
- }
-
- private _back() {
- this._actionPageService?.closeTopPage();
- }
-
- render() {
- return html`Create page 1 for entity: ${this._entity.name}
- This is the first create page, here you can go next or back (it just closes the modal for now)
-
- `;
- }
-}
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-tree-action-create-page': UmbTreeActionCreatePageElement;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged.element.ts
deleted file mode 100644
index 0106810ccd..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/actions/action-document-paged.element.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { UUITextStyles } from '@umbraco-ui/uui-css';
-import { css, html } from 'lit';
-import { customElement } from 'lit/decorators.js';
-import UmbTreeItemActionElement from '../../../../shared/components/tree/action/tree-item-action.element';
-
-import './action-document-paged-page.element';
-import './action-document-paged-page-2.element';
-
-@customElement('umb-tree-action-create')
-export class UmbTreeActionCreateElement extends UmbTreeItemActionElement {
- static styles = [UUITextStyles, css``];
-
- private _handleLabelClick() {
- this._actionPageService?.openPage('umb-tree-action-create-page');
- }
-
- render() {
- return html`
-
- `;
- }
-}
-
-export default UmbTreeActionCreateElement;
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-tree-action-create': UmbTreeActionCreateElement;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts
index cce9a30c50..fe520cf1d6 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts
@@ -100,6 +100,10 @@ export class UmbDocumentWorkspaceContext
this.#activeVariantsInfo.next(activeVariants);
}
+ openSplitView(culture: string | null, segment: string | null) {
+ this.setActiveVariant(1, culture, segment);
+ }
+
getVariant(variantId: UmbVariantId) {
return this.#draft.getValue()?.variants?.find((x) => variantId.compare(x));
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts
index ba0ffef964..e4fb29c8ad 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts
@@ -14,7 +14,7 @@ export class UmbDocumentWorkspaceElement extends UmbLitElement implements UmbWor
UUITextStyles,
css`
:host {
- display: block;
+ display: flex;
width: 100%;
height: 100%;
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/document-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/document-workspace-view-edit.element.ts
index aadbc4f820..702f87f209 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/document-workspace-view-edit.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/document-workspace-view-edit.element.ts
@@ -15,6 +15,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement {
css`
:host {
display: block;
+ --uui-tab-background: var(--uui-color-surface);
}
`,
];
@@ -135,7 +136,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement {
? html`
Content
@@ -160,7 +161,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement {
this._routerPath = event.target.absoluteRouterPath;
}}
@change=${(event: UmbRouterSlotChangeEvent) => {
- this._activePath = event.target.localActiveViewPath || '';
+ this._activePath = event.target.absoluteActiveViewPath || '';
}}>
`;
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/index.ts
index 5f5aac6a97..bf9cceb4dc 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/index.ts
@@ -9,10 +9,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
import { ManifestTypes } from '@umbraco-cms/extensions-registry';
const registerExtensions = (manifests: Array) => {
- manifests.forEach((manifest) => {
- if (umbExtensionsRegistry.isRegistered(manifest.alias)) return;
- umbExtensionsRegistry.register(manifest);
- });
+ manifests.forEach((manifest) => umbExtensionsRegistry.register(manifest));
};
registerExtensions([
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/index.ts
index 7afe8c49db..89e6e16643 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/index.ts
@@ -7,10 +7,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
import { ManifestTypes } from '@umbraco-cms/extensions-registry';
const registerExtensions = (manifests: Array) => {
- manifests.forEach((manifest) => {
- if (umbExtensionsRegistry.isRegistered(manifest.alias)) return;
- umbExtensionsRegistry.register(manifest);
- });
+ manifests.forEach((manifest) => umbExtensionsRegistry.register(manifest));
};
registerExtensions([...mediaSectionManifests, ...mediaMenuManifests, ...mediaManifests, ...mediaTypesManifests]);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/manifests.ts
index 2460e11e38..dc5de79647 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/manifests.ts
@@ -1,13 +1,33 @@
import { UmbMediaTypeRepository } from './media-type.repository';
+import { UmbMediaTypeStore } from './media-type.detail.store';
+import { UmbMediaTypeTreeStore } from './media-type.tree.store';
import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
-export const MEDIA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.MediaTypes';
+export const MEDIA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.MediaType';
const repository: ManifestRepository = {
type: 'repository',
alias: MEDIA_TYPE_REPOSITORY_ALIAS,
- name: 'Media Types Repository',
+ name: 'Media Type Repository',
class: UmbMediaTypeRepository,
};
-export const manifests = [repository];
+export const MEDIA_TYPE_STORE_ALIAS = 'Umb.Store.MediaType';
+export const MEDIA_TYPE_TREE_STORE_ALIAS = 'Umb.Store.MediaTypeTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: MEDIA_TYPE_STORE_ALIAS,
+ name: 'Media Type Store',
+ class: UmbMediaTypeStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: MEDIA_TYPE_TREE_STORE_ALIAS,
+ name: 'Media Type Tree Store',
+ class: UmbMediaTypeTreeStore,
+};
+
+export const manifests = [store, treeStore, repository];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts
index c6dfb6cbd7..57dc378d61 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts
@@ -10,13 +10,11 @@ import type { MediaTypeDetails } from '@umbraco-cms/models';
* @extends {UmbStoreBase}
* @description - Details Data Store for Media Types
*/
-export class UmbMediaTypeDetailStore
- extends UmbStoreBase
-{
+export class UmbMediaTypeStore extends UmbStoreBase {
#data = new ArrayState([], (x) => x.key);
constructor(host: UmbControllerHostInterface) {
- super(host, UmbMediaTypeDetailStore.name);
+ super(host, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN.toString());
}
append(mediaType: MediaTypeDetails) {
@@ -25,9 +23,7 @@ export class UmbMediaTypeDetailStore
remove(uniques: string[]) {
this.#data.remove(uniques);
- }
+ }
}
-export const UMB_MEDIA_TYPE_DETAIL_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbMediaTypeDetailStore.name
-);
\ No newline at end of file
+export const UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMediaTypeStore');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts
index bb3e3ff038..8123483e57 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts
@@ -1,12 +1,12 @@
import { UmbMediaTypeTreeStore, UMB_MEDIA_TYPE_TREE_STORE_CONTEXT_TOKEN } from './media-type.tree.store';
import { UmbMediaTypeDetailServerDataSource } from './sources/media-type.detail.server.data';
-import { UmbMediaTypeDetailStore, UMB_MEDIA_TYPE_DETAIL_STORE_CONTEXT_TOKEN } from './media-type.detail.store';
+import { UmbMediaTypeStore, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN } from './media-type.detail.store';
import { MediaTypeTreeServerDataSource } from './sources/media-type.tree.server.data';
import { ProblemDetailsModel } from '@umbraco-cms/backend-api';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import type { MediaTypeDetails } from '@umbraco-cms/models';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
import { UmbTreeRepository, RepositoryTreeDataSource } from '@umbraco-cms/repository';
export class UmbMediaTypeRepository implements UmbTreeRepository {
@@ -18,9 +18,9 @@ export class UmbMediaTypeRepository implements UmbTreeRepository {
#treeStore?: UmbMediaTypeTreeStore;
#detailSource: UmbMediaTypeDetailServerDataSource;
- #detailStore?: UmbMediaTypeDetailStore;
+ #store?: UmbMediaTypeStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -30,16 +30,16 @@ export class UmbMediaTypeRepository implements UmbTreeRepository {
this.#detailSource = new UmbMediaTypeDetailServerDataSource(this.#host);
this.#init = Promise.all([
- new UmbContextConsumerController(this.#host, UMB_MEDIA_TYPE_DETAIL_STORE_CONTEXT_TOKEN, (instance) => {
- this.#detailStore = instance;
+ new UmbContextConsumerController(this.#host, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN, (instance) => {
+ this.#store = instance;
}),
new UmbContextConsumerController(this.#host, UMB_MEDIA_TYPE_TREE_STORE_CONTEXT_TOKEN, (instance) => {
this.#treeStore = instance;
}),
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
}),
]);
}
@@ -120,7 +120,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository {
const { data, error } = await this.#detailSource.get(key);
if (data) {
- this.#detailStore?.append(data);
+ this.#store?.append(data);
}
return { data, error };
}
@@ -144,13 +144,13 @@ export class UmbMediaTypeRepository implements UmbTreeRepository {
if (!error) {
const notification = { data: { message: `Media type '${mediaType.name}' saved` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server
// Consider notify a workspace if a media type is updated in the store while someone is editing it.
- this.#detailStore?.append(mediaType);
+ this.#store?.append(mediaType);
this.#treeStore?.updateItem(mediaType.key, { name: mediaType.name });
// TODO: would be nice to align the stores on methods/methodNames.
@@ -169,7 +169,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository {
if (!error) {
const notification = { data: { message: `Media type '${mediaType.name}' created` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
return { data, error };
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.tree.store.ts
index fa1d2ab1dc..a70127f5d6 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.tree.store.ts
@@ -9,7 +9,6 @@ import type { UmbControllerHostInterface } from '@umbraco-cms/controller';
* @description - Tree Data Store for Media Types
*/
export class UmbMediaTypeTreeStore extends UmbTreeStoreBase {
-
/**
* Creates an instance of UmbMediaTypeTreeStore.
* @param {UmbControllerHostInterface} host
@@ -21,5 +20,5 @@ export class UmbMediaTypeTreeStore extends UmbTreeStoreBase {
}
export const UMB_MEDIA_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbMediaTypeTreeStore.name
+ 'UmbMediaTypeTreeStore'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/tree/manifests.ts
index d86f86bac8..2b64d4357b 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/tree/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/tree/manifests.ts
@@ -1,5 +1,5 @@
import { UmbMediaTypeRepository } from '../repository/media-type.repository';
-import type { ManifestTree, ManifestTreeItemAction } from '@umbraco-cms/models';
+import type { ManifestTree } from '@umbraco-cms/models';
const tree: ManifestTree = {
type: 'tree',
@@ -10,6 +10,4 @@ const tree: ManifestTree = {
},
};
-const treeItemActions: Array = [];
-
-export const manifests = [tree, ...treeItemActions];
+export const manifests = [tree];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-actions/manifests.ts
index 07c8ca11f8..e34ec47335 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-actions/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-actions/manifests.ts
@@ -1,3 +1,4 @@
+import { MEDIA_REPOSITORY_ALIAS } from '../repository/manifests';
import { UmbTrashEntityAction } from '@umbraco-cms/entity-action';
import { ManifestEntityAction } from 'libs/extensions-registry/entity-action.models';
@@ -11,7 +12,7 @@ const entityActions: Array = [
icon: 'umb:trash',
label: 'Trash',
api: UmbTrashEntityAction,
- repositoryAlias: 'Umb.Repository.Media',
+ repositoryAlias: MEDIA_REPOSITORY_ALIAS,
},
},
];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/manifests.ts
index 14a585f00a..86b84b2856 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/manifests.ts
@@ -1,10 +1,10 @@
+import { MEDIA_REPOSITORY_ALIAS } from '../repository/manifests';
import { UmbMediaMoveEntityBulkAction } from './move/move.action';
import { UmbMediaCopyEntityBulkAction } from './copy/copy.action';
import { UmbMediaTrashEntityBulkAction } from './trash/trash.action';
import { ManifestEntityBulkAction } from '@umbraco-cms/extensions-registry';
const entityType = 'media';
-const repositoryAlias = 'Umb.Repository.Media';
const entityActions: Array = [
{
@@ -15,7 +15,7 @@ const entityActions: Array = [
meta: {
entityType,
label: 'Move',
- repositoryAlias,
+ repositoryAlias: MEDIA_REPOSITORY_ALIAS,
api: UmbMediaMoveEntityBulkAction,
},
},
@@ -27,7 +27,7 @@ const entityActions: Array = [
meta: {
entityType,
label: 'Copy',
- repositoryAlias,
+ repositoryAlias: MEDIA_REPOSITORY_ALIAS,
api: UmbMediaCopyEntityBulkAction,
},
},
@@ -39,7 +39,7 @@ const entityActions: Array = [
meta: {
entityType,
label: 'Trash',
- repositoryAlias,
+ repositoryAlias: MEDIA_REPOSITORY_ALIAS,
api: UmbMediaTrashEntityBulkAction,
},
},
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/move/move.action.ts
index 03ae8d0722..30ae1aeac3 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/move/move.action.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/move/move.action.ts
@@ -2,22 +2,22 @@ import type { UmbMediaRepository } from '../../repository/media.repository';
import { UmbEntityBulkActionBase } from '@umbraco-cms/entity-action';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/modal';
export class UmbMediaMoveEntityBulkAction extends UmbEntityBulkActionBase {
- #modalService?: UmbModalService;
+ #modalContext?: UmbModalContext;
constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) {
super(host, repositoryAlias, selection);
- new UmbContextConsumerController(host, UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#modalService = instance;
+ new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this.#modalContext = instance;
});
}
async execute() {
// TODO: the picker should be single picker by default
- const modalHandler = this.#modalService?.mediaPicker({ selection: [], multiple: false });
+ const modalHandler = this.#modalContext?.mediaPicker({ selection: [], multiple: false });
const selection = await modalHandler?.onClose();
const destination = selection[0];
await this.repository?.move(this.selection, destination);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/trash/trash.action.ts
index b767646fee..672bcc49b8 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/trash/trash.action.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/trash/trash.action.ts
@@ -3,29 +3,29 @@ import type { UmbMediaRepository } from '../../repository/media.repository';
import { UmbEntityBulkActionBase } from '@umbraco-cms/entity-action';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/modal';
export class UmbMediaTrashEntityBulkAction extends UmbEntityBulkActionBase {
- #modalService?: UmbModalService;
+ #modalContext?: UmbModalContext;
constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) {
super(host, repositoryAlias, selection);
- new UmbContextConsumerController(host, UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#modalService = instance;
+ new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this.#modalContext = instance;
});
}
async execute() {
// TODO: show error
- if (!this.#modalService || !this.repository) return;
+ if (!this.#modalContext || !this.repository) return;
// TODO: should we subscribe in cases like this?
const { data } = await this.repository.requestTreeItems(this.selection);
if (data) {
// TODO: use correct markup
- const modalHandler = this.#modalService?.confirm({
+ const modalHandler = this.#modalContext?.confirm({
headline: `Deleting ${this.selection.length} items`,
content: html`
This will delete the following files:
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/manifests.ts
index 42be462f7e..0cbeb9aede 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/manifests.ts
@@ -1,13 +1,33 @@
import { UmbMediaRepository } from './media.repository';
+import { UmbMediaStore } from './media.store';
+import { UmbMediaTreeStore } from './media.tree.store';
import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
-export const DOCUMENT_REPOSITORY_ALIAS = 'Umb.Repository.Media';
+export const MEDIA_REPOSITORY_ALIAS = 'Umb.Repository.Media';
const repository: ManifestRepository = {
type: 'repository',
- alias: DOCUMENT_REPOSITORY_ALIAS,
+ alias: MEDIA_REPOSITORY_ALIAS,
name: 'Media Repository',
class: UmbMediaRepository,
};
-export const manifests = [repository];
+export const MEDIA_STORE_ALIAS = 'Umb.Store.Media';
+export const MEDIA_TREE_STORE_ALIAS = 'Umb.Store.MediaTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: MEDIA_STORE_ALIAS,
+ name: 'Media Store',
+ class: UmbMediaStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: MEDIA_TREE_STORE_ALIAS,
+ name: 'Media Tree Store',
+ class: UmbMediaTreeStore,
+};
+
+export const manifests = [store, treeStore, repository];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts
index 831af8b644..067a71dd84 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts
@@ -1,7 +1,7 @@
import type { RepositoryTreeDataSource } from '../../../../../libs/repository/repository-tree-data-source.interface';
import { MediaTreeServerDataSource } from './sources/media.tree.server.data';
import { UmbMediaTreeStore, UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN } from './media.tree.store';
-import { UmbMediaDetailStore, UMB_MEDIA_DETAIL_STORE_CONTEXT_TOKEN } from './media.detail.store';
+import { UmbMediaStore, UMB_MEDIA_STORE_CONTEXT_TOKEN } from './media.store';
import { UmbMediaDetailServerDataSource } from './sources/media.detail.server.data';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
@@ -9,7 +9,7 @@ import { ProblemDetailsModel } from '@umbraco-cms/backend-api';
import type { UmbTreeRepository } from 'libs/repository/tree-repository.interface';
import { UmbDetailRepository } from '@umbraco-cms/repository';
import type { MediaDetails } from '@umbraco-cms/models';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
type ItemDetailType = MediaDetails;
@@ -26,9 +26,9 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor
#treeStore?: UmbMediaTreeStore;
#detailDataSource: UmbMediaDetailServerDataSource;
- #detailStore?: UmbMediaDetailStore;
+ #store?: UmbMediaStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -42,12 +42,12 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor
this.#treeStore = instance;
}),
- new UmbContextConsumerController(this.#host, UMB_MEDIA_DETAIL_STORE_CONTEXT_TOKEN, (instance) => {
- this.#detailStore = instance;
+ new UmbContextConsumerController(this.#host, UMB_MEDIA_STORE_CONTEXT_TOKEN, (instance) => {
+ this.#store = instance;
}),
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
}),
]);
}
@@ -133,7 +133,7 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor
const { data, error } = await this.#detailDataSource.get(key);
if (data) {
- this.#detailStore?.append(data);
+ this.#store?.append(data);
}
return { data, error };
@@ -152,12 +152,12 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor
if (!error) {
const notification = { data: { message: `Media created` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server
- this.#detailStore?.append(template);
+ this.#store?.append(template);
// TODO: Update tree store with the new item? or ask tree to request the new item?
return { error };
@@ -174,13 +174,13 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor
if (!error) {
const notification = { data: { message: `Document saved` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server
// Consider notify a workspace if a template is updated in the store while someone is editing it.
- this.#detailStore?.append(document);
+ this.#store?.append(document);
this.#treeStore?.updateItem(document.key, { name: document.name });
// TODO: would be nice to align the stores on methods/methodNames.
@@ -200,13 +200,13 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor
if (!error) {
const notification = { data: { message: `Document deleted` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server.
// Consider notify a workspace if a template is deleted from the store while someone is editing it.
- this.#detailStore?.remove([key]);
+ this.#store?.remove([key]);
this.#treeStore?.removeItem(key);
// TODO: would be nice to align the stores on methods/methodNames.
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts
similarity index 68%
rename from src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.detail.store.ts
rename to src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts
index 7519f79e8f..070a596885 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.detail.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts
@@ -6,26 +6,26 @@ import { UmbControllerHostInterface } from '@umbraco-cms/controller';
/**
* @export
- * @class UmbMediaDetailStore
+ * @class UmbMediaStore
* @extends {UmbStoreBase}
* @description - Data Store for Template Details
*/
-export class UmbMediaDetailStore extends UmbStoreBase {
+export class UmbMediaStore extends UmbStoreBase {
#data = new ArrayState([], (x) => x.key);
/**
- * Creates an instance of UmbMediaDetailStore.
+ * Creates an instance of UmbMediaStore.
* @param {UmbControllerHostInterface} host
- * @memberof UmbMediaDetailStore
+ * @memberof UmbMediaStore
*/
constructor(host: UmbControllerHostInterface) {
- super(host, UmbMediaDetailStore.name);
+ super(host, UMB_MEDIA_STORE_CONTEXT_TOKEN.toString());
}
/**
* Append a media to the store
* @param {MediaDetails} media
- * @memberof UmbMediaDetailStore
+ * @memberof UmbMediaStore
*/
append(media: MediaDetails) {
this.#data.append([media]);
@@ -34,11 +34,11 @@ export class UmbMediaDetailStore extends UmbStoreBase {
/**
* Removes media in the store with the given uniques
* @param {string[]} uniques
- * @memberof UmbMediaDetailStore
+ * @memberof UmbMediaStore
*/
remove(uniques: string[]) {
this.#data.remove(uniques);
}
}
-export const UMB_MEDIA_DETAIL_STORE_CONTEXT_TOKEN = new UmbContextToken(UmbMediaDetailStore.name);
+export const UMB_MEDIA_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMediaStore');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts
index 572b71a06f..a070665602 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts
@@ -1,17 +1,18 @@
import { EntityTreeItemModel } from '@umbraco-cms/backend-api';
import { UmbContextToken } from '@umbraco-cms/context-api';
import { ArrayState } from '@umbraco-cms/observable-api';
-import { UmbStoreBase } from '@umbraco-cms/store';
+import { UmbTreeStoreBase } from '@umbraco-cms/store';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
+export const UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMediaTreeStore');
+
/**
* @export
* @class UmbMediaTreeStore
- * @extends {UmbStoreBase}
- * @description - Tree Data Store for Templates
+ * @extends {UmbTreeStoreBase}
+ * @description - Tree Data Store for Media
*/
-// TODO: consider if tree store could be turned into a general EntityTreeStore class?
-export class UmbMediaTreeStore extends UmbStoreBase {
+export class UmbMediaTreeStore extends UmbTreeStoreBase {
#data = new ArrayState([], (x) => x.key);
/**
@@ -22,70 +23,4 @@ export class UmbMediaTreeStore extends UmbStoreBase {
constructor(host: UmbControllerHostInterface) {
super(host, UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN.toString());
}
-
- /**
- * Appends items to the store
- * @param {Array} items
- * @memberof UmbMediaTreeStore
- */
- appendItems(items: Array) {
- this.#data.append(items);
- }
-
- /**
- * Updates an item in the store
- * @param {string} key
- * @param {Partial} data
- * @memberof UmbMediaTreeStore
- */
- updateItem(key: string, data: Partial) {
- const entries = this.#data.getValue();
- const entry = entries.find((entry) => entry.key === key);
-
- if (entry) {
- this.#data.appendOne({ ...entry, ...data });
- }
- }
-
- /**
- * Removes an item from the store
- * @param {string} key
- * @memberof UmbMediaTreeStore
- */
- removeItem(key: string) {
- const entries = this.#data.getValue();
- const entry = entries.find((entry) => entry.key === key);
-
- if (entry) {
- this.#data.remove([key]);
- }
- }
-
- /**
- * An observable to observe the root items
- * @memberof UmbMediaTreeStore
- */
- rootItems = this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === null));
-
- /**
- * Returns an observable to observe the children of a given parent
- * @param {(string | null)} parentKey
- * @return {*}
- * @memberof UmbMediaTreeStore
- */
- childrenOf(parentKey: string | null) {
- return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === parentKey));
- }
-
- /**
- * Returns an observable to observe the items with the given keys
- * @param {Array} keys
- * @return {*}
- * @memberof UmbMediaTreeStore
- */
- items(keys: Array) {
- return this.#data.getObservablePart((items) => items.filter((item) => keys.includes(item.key ?? '')));
- }
}
-
-export const UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(UmbMediaTreeStore.name);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/tree/manifests.ts
index 53fccb3e97..0e60c1d4af 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/tree/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/tree/manifests.ts
@@ -1,5 +1,5 @@
import { UmbMediaRepository } from '../repository/media.repository';
-import type { ManifestTree, ManifestTreeItemAction } from '@umbraco-cms/models';
+import type { ManifestTree } from '@umbraco-cms/models';
const treeAlias = 'Umb.Tree.Media';
@@ -12,6 +12,4 @@ const tree: ManifestTree = {
},
};
-const treeItemActions: Array = [];
-
-export const manifests = [tree, ...treeItemActions];
+export const manifests = [tree];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/manifests.ts
index 29af2a95c6..3c363283c7 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/manifests.ts
@@ -1,3 +1,4 @@
+import { MEDIA_REPOSITORY_ALIAS } from '../repository/manifests';
import { UmbSaveWorkspaceAction } from '@umbraco-cms/workspace';
import type {
ManifestWorkspace,
@@ -59,7 +60,7 @@ const workspaceViewCollections: Array = [
pathname: 'collection',
icon: 'umb:grid',
entityType: 'media',
- repositoryAlias: 'Umb.Repository.Media',
+ repositoryAlias: MEDIA_REPOSITORY_ALIAS,
},
},
];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/section.manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/section.manifests.ts
index e7f137f2b8..9ba71485a5 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/media/section.manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/section.manifests.ts
@@ -1,3 +1,4 @@
+import { MEDIA_REPOSITORY_ALIAS } from './media/repository/manifests';
import type { ManifestDashboardCollection, ManifestSection, ManifestMenuSectionSidebarApp } from '@umbraco-cms/models';
const sectionAlias = 'Umb.Section.Media';
@@ -24,7 +25,7 @@ const dashboards: Array = [
sections: [sectionAlias],
pathname: 'media-management',
entityType: 'media',
- repositoryAlias: 'Umb.Repository.Media',
+ repositoryAlias: MEDIA_REPOSITORY_ALIAS,
},
},
];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/index.ts
index 0f5f91f7e7..c5731e4ba3 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/index.ts
@@ -8,10 +8,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
import { ManifestTypes } from '@umbraco-cms/extensions-registry';
const registerExtensions = (manifests: Array) => {
- manifests.forEach((manifest) => {
- if (umbExtensionsRegistry.isRegistered(manifest.alias)) return;
- umbExtensionsRegistry.register(manifest);
- });
+ manifests.forEach((manifest) => umbExtensionsRegistry.register(manifest));
};
registerExtensions([
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/entity-actions/manifests.ts
index 5e84d8d6db..e132cc6f8f 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/entity-actions/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/entity-actions/manifests.ts
@@ -1,3 +1,4 @@
+import { MEMBER_GROUP_REPOSITORY_ALIAS } from '../repository/manifests';
import { UmbDeleteEntityAction } from '@umbraco-cms/entity-action';
import { ManifestEntityAction } from 'libs/extensions-registry/entity-action.models';
@@ -11,7 +12,7 @@ const entityActions: Array = [
icon: 'umb:trash',
label: 'Delete',
api: UmbDeleteEntityAction,
- repositoryAlias: 'Umb.Repository.MemberGroup',
+ repositoryAlias: MEMBER_GROUP_REPOSITORY_ALIAS,
},
},
];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/manifests.ts
index 728b8ae95f..c4fb973526 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/manifests.ts
@@ -1,5 +1,8 @@
import { UmbMemberGroupRepository } from './member-group.repository';
+import { UmbMemberGroupStore } from './member-group.store';
+import { UmbMemberGroupTreeStore } from './member-group.tree.store';
import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
export const MEMBER_GROUP_REPOSITORY_ALIAS = 'Umb.Repository.MemberGroup';
@@ -10,4 +13,21 @@ const repository: ManifestRepository = {
class: UmbMemberGroupRepository,
};
-export const manifests = [repository];
+export const MEMBER_GROUP_STORE_ALIAS = 'Umb.Store.MemberGroup';
+export const MEMBER_GROUP_TREE_STORE_ALIAS = 'Umb.Store.MemberGroupTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: MEMBER_GROUP_STORE_ALIAS,
+ name: 'Member Group Store',
+ class: UmbMemberGroupStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: MEMBER_GROUP_TREE_STORE_ALIAS,
+ name: 'Member Group Tree Store',
+ class: UmbMemberGroupTreeStore,
+};
+
+export const manifests = [store, treeStore, repository];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts
index 7f273071e5..0c0f315b71 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts
@@ -1,9 +1,9 @@
import { UmbMemberGroupTreeStore, UMB_MEMBER_GROUP_TREE_STORE_CONTEXT_TOKEN } from './member-group.tree.store';
import { UmbMemberGroupDetailServerDataSource } from './sources/member-group.detail.server.data';
-import { UmbMemberGroupDetailStore, UMB_MEMBER_GROUP_DETAIL_STORE_CONTEXT_TOKEN } from './member-group.detail.store';
+import { UmbMemberGroupStore, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN } from './member-group.store';
import { MemberGroupTreeServerDataSource } from './sources/member-group.tree.server.data';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
import type { MemberGroupDetails } from '@umbraco-cms/models';
import { ProblemDetailsModel } from '@umbraco-cms/backend-api';
@@ -19,9 +19,9 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep
#treeStore?: UmbMemberGroupTreeStore;
#detailSource: UmbMemberGroupDetailServerDataSource;
- #detailStore?: UmbMemberGroupDetailStore;
+ #store?: UmbMemberGroupStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -33,12 +33,12 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep
this.#treeStore = instance;
});
- new UmbContextConsumerController(this.#host, UMB_MEMBER_GROUP_DETAIL_STORE_CONTEXT_TOKEN, (instance) => {
- this.#detailStore = instance;
+ new UmbContextConsumerController(this.#host, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN, (instance) => {
+ this.#store = instance;
});
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
});
}
@@ -74,7 +74,7 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep
async rootTreeItems() {
await this.#init;
- return this.#treeStore!.rootItems();
+ return this.#treeStore!.rootItems;
}
async treeItemsOf(parentKey: string | null) {
@@ -106,7 +106,7 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep
const { data, error } = await this.#detailSource.get(key);
if (data) {
- this.#detailStore?.append(data);
+ this.#store?.append(data);
}
return { data, error };
}
@@ -123,7 +123,7 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep
if (!error) {
const notification = { data: { message: `Member group '${detail.name}' created` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
return { data, error };
@@ -141,10 +141,10 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep
if (!error) {
const notification = { data: { message: `Member group '${memberGroup.name} saved` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
- this.#detailStore?.append(memberGroup);
+ this.#store?.append(memberGroup);
this.#treeStore?.updateItem(memberGroup.key, { name: memberGroup.name });
return { error };
@@ -162,13 +162,13 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep
if (!error) {
const notification = { data: { message: `Document deleted` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server.
// Consider notify a workspace if a template is deleted from the store while someone is editing it.
- this.#detailStore?.remove([key]);
+ this.#store?.remove([key]);
this.#treeStore?.removeItem(key);
// TODO: would be nice to align the stores on methods/methodNames.
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts
similarity index 63%
rename from src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.detail.store.ts
rename to src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts
index 64c5973d5d..864430facf 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.detail.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts
@@ -6,17 +6,15 @@ import { UmbStoreBase } from '@umbraco-cms/store';
/**
* @export
- * @class UmbMemberGroupDetailStore
+ * @class UmbMemberGroupStore
* @extends {UmbStoreBase}
- * @description - Details Data Store for Member Groups
+ * @description - Data Store for Member Groups
*/
-export class UmbMemberGroupDetailStore
- extends UmbStoreBase
-{
+export class UmbMemberGroupStore extends UmbStoreBase {
#data = new ArrayState([], (x) => x.key);
constructor(host: UmbControllerHostInterface) {
- super(host, UmbMemberGroupDetailStore.name);
+ super(host, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN.toString());
}
append(memberGroup: MemberGroupDetails) {
@@ -25,9 +23,7 @@ export class UmbMemberGroupDetailStore
remove(uniques: string[]) {
this.#data.remove(uniques);
- }
+ }
}
-export const UMB_MEMBER_GROUP_DETAIL_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbMemberGroupDetailStore.name
-);
\ No newline at end of file
+export const UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberGroupStore');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.tree.store.ts
index a1e5a29659..4d1f4ce44a 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.tree.store.ts
@@ -1,95 +1,24 @@
-import type { EntityTreeItemModel } from '@umbraco-cms/backend-api';
import { UmbContextToken } from '@umbraco-cms/context-api';
-import { ArrayState } from '@umbraco-cms/observable-api';
-import { UmbStoreBase } from '@umbraco-cms/store';
+import { UmbTreeStoreBase } from '@umbraco-cms/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/controller';
/**
* @export
* @class UmbMemberGroupTreeStore
- * @extends {UmbStoreBase}
+ * @extends {UmbTreeStoreBase}
* @description - Tree Data Store for Member Groups
*/
-export class UmbMemberGroupTreeStore extends UmbStoreBase {
- #data = new ArrayState([], (x) => x.key);
-
+export class UmbMemberGroupTreeStore extends UmbTreeStoreBase {
/**
- * Creates an instance of UmbTemplateTreeStore.
+ * Creates an instance of UmbMemberGroupTreeStore.
* @param {UmbControllerHostInterface} host
* @memberof UmbMemberGroupTreeStore
*/
constructor(host: UmbControllerHostInterface) {
super(host, UMB_MEMBER_GROUP_TREE_STORE_CONTEXT_TOKEN.toString());
}
-
- /**
- * Appends items to the store
- * @param {Array} items
- * @memberof UmbTemplateTreeStore
- */
- appendItems(items: Array) {
- this.#data.append(items);
- }
-
- /**
- * Updates an item in the store
- * @param {string} key
- * @param {Partial} data
- * @memberof UmbMemberGroupTreeStore
- */
- updateItem(key: string, data: Partial) {
- const entries = this.#data.getValue();
- const entry = entries.find((entry) => entry.key === key);
-
- if (entry) {
- this.#data.appendOne({ ...entry, ...data });
- }
- }
-
- /**
- * Removes an item from the store
- * @param {string} key
- * @memberof UmbMemberGroupTreeStore
- */
- removeItem(key: string) {
- const entries = this.#data.getValue();
- const entry = entries.find((entry) => entry.key === key);
-
- if (entry) {
- this.#data.remove([key]);
- }
- }
-
- /**
- * Returns an observable to observe the root items
- * @return {*}
- * @memberof UmbMemberGroupTreeStore
- */
- rootItems() {
- return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === null));
- }
-
- /**
- * Returns an observable to observe the children of a given parent
- * @param {(string | null)} parentKey
- * @return {*}
- * @memberof UmbMemberGroupTreeStore
- */
- childrenOf(parentKey: string | null) {
- return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === parentKey));
- }
-
- /**
- * Returns an observable to observe the items with the given keys
- * @param {Array} keys
- * @return {*}
- * @memberof UmbMemberGroupTreeStore
- */
- items(keys: Array) {
- return this.#data.getObservablePart((items) => items.filter((item) => keys.includes(item.key ?? '')));
- }
}
export const UMB_MEMBER_GROUP_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbMemberGroupTreeStore.name
+ 'UmbMemberGroupTreeStore'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/manifests.ts
index deee635772..f40c631433 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/manifests.ts
@@ -1,7 +1,9 @@
import { UmbMemberTypeRepository } from './member-type.repository';
-import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { UmbMemberTypeStore } from './member-type.store';
+import { UmbMemberTypeTreeStore } from './member-type.tree.store';
+import type { ManifestRepository, ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
-export const MEMBER_TYPES_REPOSITORY_ALIAS = 'Umb.Repository.MemberTypes';
+export const MEMBER_TYPES_REPOSITORY_ALIAS = 'Umb.Repository.MemberType';
const repository: ManifestRepository = {
type: 'repository',
@@ -10,4 +12,21 @@ const repository: ManifestRepository = {
class: UmbMemberTypeRepository,
};
-export const manifests = [repository];
\ No newline at end of file
+export const MEMBER_TYPE_STORE_ALIAS = 'Umb.Store.MemberType';
+export const MEMBER_TYPE_TREE_STORE_ALIAS = 'Umb.Store.MemberTypeTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: MEMBER_TYPE_STORE_ALIAS,
+ name: 'Member Type Store',
+ class: UmbMemberTypeStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: MEMBER_TYPE_TREE_STORE_ALIAS,
+ name: 'Member Type Tree Store',
+ class: UmbMemberTypeTreeStore,
+};
+
+export const manifests = [store, treeStore, repository];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts
index c03d4eeb44..83120d5b3d 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts
@@ -1,12 +1,12 @@
import { MemberTypeTreeServerDataSource } from './sources/member-type.tree.server.data';
import { UmbMemberTypeTreeStore, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN } from './member-type.tree.store';
-import { UmbMemberTypeDetailStore, UMB_MEMBER_TYPE_DETAIL_STORE_CONTEXT_TOKEN } from './member-type.detail.store';
+import { UmbMemberTypeStore, UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN } from './member-type.store';
import { UmbMemberTypeDetailServerDataSource } from './sources/member-type.detail.server.data';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
import { RepositoryTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/repository';
import { ProblemDetailsModel } from '@umbraco-cms/backend-api';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
import type { MemberTypeDetails } from '@umbraco-cms/models';
// TODO => use correct type when available
@@ -21,9 +21,9 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, UmbDetailRepo
#treeStore?: UmbMemberTypeTreeStore;
#detailSource: UmbMemberTypeDetailServerDataSource;
- #detailStore?: UmbMemberTypeDetailStore;
+ #store?: UmbMemberTypeStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -33,16 +33,16 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, UmbDetailRepo
this.#detailSource = new UmbMemberTypeDetailServerDataSource(this.#host);
this.#init = Promise.all([
- new UmbContextConsumerController(this.#host, UMB_MEMBER_TYPE_DETAIL_STORE_CONTEXT_TOKEN, (instance) => {
- this.#detailStore = instance;
+ new UmbContextConsumerController(this.#host, UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN, (instance) => {
+ this.#store = instance;
}),
new UmbContextConsumerController(this.#host, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN, (instance) => {
this.#treeStore = instance;
}),
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
}),
]);
}
@@ -123,7 +123,7 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, UmbDetailRepo
const { data, error } = await this.#detailSource.requestByKey(key);
if (data) {
- this.#detailStore?.append(data);
+ this.#store?.append(data);
}
return { data, error };
}
@@ -140,13 +140,13 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, UmbDetailRepo
if (!error) {
const notification = { data: { message: `Member type deleted` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server.
// Consider notify a workspace if a member type is deleted from the store while someone is editing it.
- this.#detailStore?.remove([key]);
+ this.#store?.remove([key]);
this.#treeStore?.removeItem(key);
// TODO: would be nice to align the stores on methods/methodNames.
@@ -167,13 +167,13 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, UmbDetailRepo
if (!error) {
const notification = { data: { message: `Member type '${detail.name}' saved` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
// Consider to look up the data before fetching from the server
// Consider notify a workspace if a member type is updated in the store while someone is editing it.
- this.#detailStore?.append(detail);
+ this.#store?.append(detail);
this.#treeStore?.updateItem(detail.key, { name: detail.name });
// TODO: would be nice to align the stores on methods/methodNames.
@@ -192,7 +192,7 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, UmbDetailRepo
if (!error) {
const notification = { data: { message: `Member type '${detail.name}' created` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
return { data, error };
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts
similarity index 64%
rename from src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.detail.store.ts
rename to src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts
index bba1a580fa..c13dacc56f 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.detail.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts
@@ -6,17 +6,15 @@ import type { MemberTypeDetails } from '@umbraco-cms/models';
/**
* @export
- * @class UmbMemberTypeDetailStore
+ * @class UmbMemberTypeStore
* @extends {UmbStoreBase}
- * @description - Details Data Store for Member Types
+ * @description - Data Store for Member Types
*/
-export class UmbMemberTypeDetailStore
- extends UmbStoreBase
-{
+export class UmbMemberTypeStore extends UmbStoreBase {
#data = new ArrayState([], (x) => x.key);
constructor(host: UmbControllerHostInterface) {
- super(host, UmbMemberTypeDetailStore.name);
+ super(host, UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN.toString());
}
append(MemberType: MemberTypeDetails) {
@@ -25,9 +23,7 @@ export class UmbMemberTypeDetailStore
remove(uniques: string[]) {
this.#data.remove(uniques);
- }
+ }
}
-export const UMB_MEMBER_TYPE_DETAIL_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbMemberTypeDetailStore.name
-);
\ No newline at end of file
+export const UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberTypeStore');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.tree.store.ts
index 7e3322625d..d10cf2953e 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.tree.store.ts
@@ -9,12 +9,11 @@ import type { UmbControllerHostInterface } from '@umbraco-cms/controller';
* @description - Tree Data Store for Member Types
*/
export class UmbMemberTypeTreeStore extends UmbTreeStoreBase {
-
constructor(host: UmbControllerHostInterface) {
super(host, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN.toString());
}
}
export const UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbMemberTypeTreeStore.name
+ 'UmbMemberTypeTreeStore'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/tree/manifests.ts
index 6aca4cf797..2e16d022d4 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/tree/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/tree/manifests.ts
@@ -1,5 +1,5 @@
import { UmbMemberTypeRepository } from '../repository/member-type.repository';
-import type { ManifestTree, ManifestTreeItemAction } from '@umbraco-cms/models';
+import type { ManifestTree } from '@umbraco-cms/models';
const treeAlias = 'Umb.Tree.MemberTypes';
@@ -8,10 +8,8 @@ const tree: ManifestTree = {
alias: treeAlias,
name: 'Member Types Tree',
meta: {
- repository: UmbMemberTypeRepository
+ repository: UmbMemberTypeRepository,
},
};
-const treeItemActions: Array = [];
-
-export const manifests = [tree, ...treeItemActions];
+export const manifests = [tree];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/entity-actions/manifests.ts
index 6f040a256b..57654c41d0 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/entity-actions/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/entity-actions/manifests.ts
@@ -1,3 +1,4 @@
+import { MEMBER_REPOSITORY_ALIAS } from '../repository/manifests';
import { UmbDeleteEntityAction } from '@umbraco-cms/entity-action';
import { ManifestEntityAction } from 'libs/extensions-registry/entity-action.models';
@@ -11,7 +12,7 @@ const entityActions: Array = [
icon: 'umb:trash',
label: 'Delete',
api: UmbDeleteEntityAction,
- repositoryAlias: 'Umb.Repository.Member',
+ repositoryAlias: MEMBER_REPOSITORY_ALIAS,
},
},
];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts
index bb665251ad..0a79950126 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts
@@ -6,33 +6,29 @@ import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbEntityDetailStore, UmbStoreBase } from '@umbraco-cms/store';
import { umbMemberData } from 'src/core/mocks/data/member.data';
-export const UMB_MEMBER_DETAIL_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberDetailStore');
-
/**
* @export
- * @class UmbMemberDetailStore
+ * @class UmbMemberStore
* @extends {UmbStoreBase}
- * @description - Detail Data Store for Members
+ * @description - Data Store for Members
*/
-export class UmbMemberDetailStore extends UmbStoreBase implements UmbEntityDetailStore {
-
- #data = new ArrayState([], x => x.key);
+export class UmbMemberStore extends UmbStoreBase implements UmbEntityDetailStore {
+ #data = new ArrayState([], (x) => x.key);
public groups = this.#data.asObservable();
constructor(private host: UmbControllerHostInterface) {
- super(host, UMB_MEMBER_DETAIL_STORE_CONTEXT_TOKEN.toString());
+ super(host, UMB_MEMBER_STORE_CONTEXT_TOKEN.toString());
}
getScaffold(entityType: string, parentKey: string | null) {
- return {
- } as MemberDetails;
+ return {} as MemberDetails;
}
/**
* @description - Request a Member by key. The Member is added to the store and is returned as an Observable.
* @param {string} key
* @return {*} {(Observable)}
- * @memberof UmbMemberDetailStore
+ * @memberof UmbMemberStore
*/
getByKey(key: string): Observable {
// tryExecuteAndNotify(this.host, MemberResource.getMemberByKey({ key })).then(({ data }) => {
@@ -47,13 +43,12 @@ export class UmbMemberDetailStore extends UmbStoreBase implements UmbEntityDetai
this.#data.appendOne(member);
}
- return createObservablePart(
- this.#data,
- (members) => members.find((member) => member.key === key) as MemberDetails
- );
+ return createObservablePart(this.#data, (members) => members.find((member) => member.key === key) as MemberDetails);
}
async save(member: Array): Promise {
return null as any;
}
}
+
+export const UMB_MEMBER_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberStore');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/manifests.ts
index cce97581b9..a2e150c0ca 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/manifests.ts
@@ -1,5 +1,8 @@
import { UmbMemberRepository } from './member.repository';
+import { UmbMemberStore } from './member.store';
+import { UmbMemberTreeStore } from './member.tree.store';
import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
export const MEMBER_REPOSITORY_ALIAS = 'Umb.Repository.Member';
@@ -10,4 +13,21 @@ const repository: ManifestRepository = {
class: UmbMemberRepository,
};
-export const manifests = [repository];
+export const MEMBER_STORE_ALIAS = 'Umb.Store.Member';
+export const MEMBER_TREE_STORE_ALIAS = 'Umb.Store.MemberTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: MEMBER_STORE_ALIAS,
+ name: 'Member Store',
+ class: UmbMemberStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: MEMBER_TREE_STORE_ALIAS,
+ name: 'Member Tree Store',
+ class: UmbMemberTreeStore,
+};
+
+export const manifests = [store, treeStore, repository];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts
index 685c54ee25..74b1d752fe 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts
@@ -1,7 +1,7 @@
import { UmbMemberTreeStore, UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN } from './member.tree.store';
import { MemberTreeServerDataSource } from './sources/member.tree.server.data';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
import { UmbTreeRepository } from '@umbraco-cms/repository';
import { ProblemDetailsModel } from '@umbraco-cms/backend-api';
@@ -10,7 +10,7 @@ export class UmbMemberRepository implements UmbTreeRepository {
#host: UmbControllerHostInterface;
#dataSource: MemberTreeServerDataSource;
#treeStore?: UmbMemberTreeStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
#initResolver?: () => void;
#initialized = false;
@@ -24,8 +24,8 @@ export class UmbMemberRepository implements UmbTreeRepository {
this.#checkIfInitialized();
});
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
this.#checkIfInitialized();
});
}
@@ -35,7 +35,7 @@ export class UmbMemberRepository implements UmbTreeRepository {
});
#checkIfInitialized() {
- if (this.#treeStore && this.#notificationService) {
+ if (this.#treeStore && this.#notificationContext) {
this.#initialized = true;
this.#initResolver?.();
}
@@ -73,7 +73,7 @@ export class UmbMemberRepository implements UmbTreeRepository {
async rootTreeItems() {
await this.#init;
- return this.#treeStore!.rootItems();
+ return this.#treeStore!.rootItems;
}
async treeItemsOf(parentKey: string | null) {
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts
new file mode 100644
index 0000000000..991ada05f4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts
@@ -0,0 +1,29 @@
+import { UmbContextToken } from '@umbraco-cms/context-api';
+import { UmbStoreBase } from '@umbraco-cms/store';
+import { UmbControllerHostInterface } from '@umbraco-cms/controller';
+import { ArrayState } from '@umbraco-cms/observable-api';
+import type { MemberDetails } from '@umbraco-cms/models';
+
+/**
+ * @export
+ * @class UmbMemberStore
+ * @extends {UmbStoreBase}
+ * @description - Data Store for Members
+ */
+export class UmbMemberStore extends UmbStoreBase {
+ #data = new ArrayState([], (x) => x.key);
+
+ constructor(host: UmbControllerHostInterface) {
+ super(host, UMB_MEMBER_STORE_CONTEXT_TOKEN.toString());
+ }
+
+ append(member: MemberDetails) {
+ this.#data.append([member]);
+ }
+
+ remove(uniques: string[]) {
+ this.#data.remove(uniques);
+ }
+}
+
+export const UMB_MEMBER_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberStore');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.tree.store.ts
index dad2c697c0..6dd095fded 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.tree.store.ts
@@ -1,18 +1,16 @@
-import type { EntityTreeItemModel } from '@umbraco-cms/backend-api';
import { UmbContextToken } from '@umbraco-cms/context-api';
-import { ArrayState } from '@umbraco-cms/observable-api';
-import { UmbStoreBase } from '@umbraco-cms/store';
+import { UmbTreeStoreBase } from '@umbraco-cms/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/controller';
+export const UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberTreeStore');
+
/**
* @export
* @class UmbMemberTreeStore
- * @extends {UmbStoreBase}
+ * @extends {UmbTreeStoreBase}
* @description - Tree Data Store for Members
*/
-export class UmbMemberTreeStore extends UmbStoreBase {
- #data = new ArrayState([], (x) => x.key);
-
+export class UmbMemberTreeStore extends UmbTreeStoreBase {
/**
* Creates an instance of UmbTemplateTreeStore.
* @param {UmbControllerHostInterface} host
@@ -21,73 +19,4 @@ export class UmbMemberTreeStore extends UmbStoreBase {
constructor(host: UmbControllerHostInterface) {
super(host, UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN.toString());
}
-
- /**
- * Appends items to the store
- * @param {Array} items
- * @memberof UmbTemplateTreeStore
- */
- appendItems(items: Array) {
- this.#data.append(items);
- }
-
- /**
- * Updates an item in the store
- * @param {string} key
- * @param {Partial} data
- * @memberof UmbMemberGroupTreeStore
- */
- updateItem(key: string, data: Partial) {
- const entries = this.#data.getValue();
- const entry = entries.find((entry) => entry.key === key);
-
- if (entry) {
- this.#data.appendOne({ ...entry, ...data });
- }
- }
-
- /**
- * Removes an item from the store
- * @param {string} key
- * @memberof UmbMemberGroupTreeStore
- */
- removeItem(key: string) {
- const entries = this.#data.getValue();
- const entry = entries.find((entry) => entry.key === key);
-
- if (entry) {
- this.#data.remove([key]);
- }
- }
-
- /**
- * Returns an observable to observe the root items
- * @return {*}
- * @memberof UmbMemberGroupTreeStore
- */
- rootItems() {
- return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === null));
- }
-
- /**
- * Returns an observable to observe the children of a given parent
- * @param {(string | null)} parentKey
- * @return {*}
- * @memberof UmbMemberGroupTreeStore
- */
- childrenOf(parentKey: string | null) {
- return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === parentKey));
- }
-
- /**
- * Returns an observable to observe the items with the given keys
- * @param {Array} keys
- * @return {*}
- * @memberof UmbMemberGroupTreeStore
- */
- items(keys: Array) {
- return this.#data.getObservablePart((items) => items.filter((item) => keys.includes(item.key ?? '')));
- }
}
-
-export const UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(UmbMemberTreeStore.name);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/tree/actions/action-member-delete.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/tree/actions/action-member-delete.element.ts
deleted file mode 100644
index ff96119d59..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/tree/actions/action-member-delete.element.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { UUITextStyles } from '@umbraco-ui/uui-css';
-import { css, html } from 'lit';
-import { customElement } from 'lit/decorators.js';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../../core/modal';
-import UmbTreeItemActionElement from '../../../../shared/components/tree/action/tree-item-action.element';
-import { UmbMemberTreeStore, UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN } from '../../repository/member.tree.store';
-
-@customElement('umb-tree-action-member-delete')
-export default class UmbTreeActionMemberDeleteElement extends UmbTreeItemActionElement {
- static styles = [UUITextStyles, css``];
-
- private _modalService?: UmbModalService;
- private _memberTreeStore?: UmbMemberTreeStore;
-
- connectedCallback(): void {
- super.connectedCallback();
-
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (modalService) => {
- this._modalService = modalService;
- });
-
- this.consumeContext(UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN, (memberTreeStore) => {
- this._memberTreeStore = memberTreeStore;
- });
- }
-
- private _handleLabelClick() {
- const modalHandler = this._modalService?.confirm({
- headline: `Delete ${this._activeTreeItem?.name ?? 'item'}`,
- content: 'Are you sure you want to delete this item?',
- color: 'danger',
- confirmLabel: 'Delete',
- });
-
- modalHandler?.onClose().then(({ confirmed }: any) => {
- if (confirmed && this._treeContextMenuService && this._memberTreeStore && this._activeTreeItem) {
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- /* @ts-ignore */
- // TODO: ignoring this error for now, because we will change this when entity actions are merged
- this._memberTreeStore?.delete([this._activeTreeItem.key]);
- this._treeContextMenuService.close();
- }
- });
- }
-
- render() {
- return html`
-
- `;
- }
-}
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-tree-action-member-delete': UmbTreeActionMemberDeleteElement;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts
index b7cb38e6ec..a032a5fefc 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts
@@ -1,7 +1,7 @@
import { UmbEntityWorkspaceManager } from '../../../shared/components/workspace/workspace-context/entity-manager-controller';
import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context';
import { UmbWorkspaceEntityContextInterface } from '../../../shared/components/workspace/workspace-context/workspace-entity-context.interface';
-import { UMB_MEMBER_DETAIL_STORE_CONTEXT_TOKEN } from '../member.detail.store';
+import { UMB_MEMBER_STORE_CONTEXT_TOKEN } from '../member.detail.store';
import { UmbMemberRepository } from '../repository/member.repository';
import type { MemberDetails } from '@umbraco-cms/models';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
@@ -10,7 +10,7 @@ export class UmbWorkspaceMemberContext
extends UmbWorkspaceContext
implements UmbWorkspaceEntityContextInterface
{
- #manager = new UmbEntityWorkspaceManager(this.host, 'member', UMB_MEMBER_DETAIL_STORE_CONTEXT_TOKEN);
+ #manager = new UmbEntityWorkspaceManager(this.host, 'member', UMB_MEMBER_STORE_CONTEXT_TOKEN);
public readonly data = this.#manager.state.asObservable();
public readonly name = this.#manager.state.getObservablePart((state) => state?.name);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/index.ts
index 7a1e274f75..2609d2d22a 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/index.ts
@@ -1,3 +1,4 @@
+import { manifests as repositoryManifests } from './repository/manifests';
import { manifests as packageBuilderManifests } from './package-builder/manifests';
import { manifests as packageRepoManifests } from './package-repo/manifests';
import { manifests as packageSectionManifests } from './package-section/manifests';
@@ -6,10 +7,12 @@ import { umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
import { ManifestTypes } from '@umbraco-cms/extensions-registry';
const registerExtensions = (manifests: Array) => {
- manifests.forEach((manifest) => {
- if (umbExtensionsRegistry.isRegistered(manifest.alias)) return;
- umbExtensionsRegistry.register(manifest);
- });
+ manifests.forEach((manifest) => umbExtensionsRegistry.register(manifest));
};
-registerExtensions([...packageBuilderManifests, ...packageRepoManifests, ...packageSectionManifests]);
+registerExtensions([
+ ...repositoryManifests,
+ ...packageBuilderManifests,
+ ...packageRepoManifests,
+ ...packageSectionManifests,
+]);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts
index 3cafbfe2cc..26b897a91b 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts
@@ -1,24 +1,295 @@
import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
-import { css, html, LitElement } from 'lit';
-import { customElement } from 'lit/decorators.js';
+import { UUIBooleanInputEvent, UUIInputElement, UUIInputEvent } from '@umbraco-ui/uui';
+import { css, html, nothing } from 'lit';
+import { customElement, property, query, state } from 'lit/decorators.js';
+import { ifDefined } from 'lit-html/directives/if-defined.js';
+import { UmbInputDocumentPickerElement } from '../../../shared/components/input-document-picker/input-document-picker.element';
+import { UmbInputMediaPickerElement } from '../../../shared/components/input-media-picker/input-media-picker.element';
+import { UmbInputLanguagePickerElement } from '../../../shared/components/input-language-picker/input-language-picker.element';
+import { UmbLitElement } from '@umbraco-cms/element';
+import { PackageDefinitionModel, PackageResource } from '@umbraco-cms/backend-api';
+import { tryExecuteAndNotify } from '@umbraco-cms/resources';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
@customElement('umb-workspace-package-builder')
-export class UmbWorkspacePackageBuilderElement extends LitElement {
+export class UmbWorkspacePackageBuilderElement extends UmbLitElement {
static styles = [
UUITextStyles,
css`
:host {
display: block;
- width: 100%;
height: 100%;
}
+
+ .header {
+ margin: 0 var(--uui-size-layout-1);
+ display: flex;
+ gap: var(--uui-size-space-4);
+ }
+
+ uui-box {
+ margin: var(--uui-size-layout-1);
+ }
+
+ uui-checkbox {
+ margin-top: var(--uui-size-space-4);
+ }
`,
];
+ @property()
+ entityKey?: string;
+
+ @state()
+ private _package: PackageDefinitionModel = {};
+
+ @query('#package-name-input')
+ private _packageNameInput!: UUIInputElement;
+
+ private _notificationContext?: UmbNotificationContext;
+
+ constructor() {
+ super();
+ this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this._notificationContext = instance;
+ });
+ }
+
+ connectedCallback(): void {
+ super.connectedCallback();
+ if (this.entityKey) this.#getPackageCreated();
+ }
+
+ async #getPackageCreated() {
+ if (!this.entityKey) return;
+ const { data } = await tryExecuteAndNotify(this, PackageResource.getPackageCreatedByKey({ key: this.entityKey }));
+ if (!data) return;
+ this._package = data as PackageDefinitionModel;
+ }
+
+ async #download() {
+ if (!this._package?.key) return;
+ const response = await tryExecuteAndNotify(
+ this,
+ PackageResource.getPackageCreatedByKeyDownload({ key: this._package.key })
+ );
+ }
+
+ #nameDefined() {
+ const valid = this._packageNameInput.checkValidity();
+ if (!valid) this._notificationContext?.peek('danger', { data: { message: 'Package missing a name' } });
+ return valid;
+ }
+
+ async #save() {
+ if (!this.#nameDefined()) return;
+ const response = await tryExecuteAndNotify(
+ this,
+ PackageResource.postPackageCreated({ requestBody: this._package })
+ );
+ if (!response.data || response.error) return;
+ this._package = response.data as PackageDefinitionModel;
+ this.#navigateBack();
+ }
+
+ async #update() {
+ if (!this.#nameDefined()) return;
+ if (!this._package?.key) return;
+ const response = await tryExecuteAndNotify(
+ this,
+ PackageResource.putPackageCreatedByKey({ key: this._package.key, requestBody: this._package })
+ );
+
+ if (response.error) return;
+ this.#navigateBack();
+ }
+
+ #navigateBack() {
+ window.history.pushState({}, '', '/section/packages/view/created');
+ }
+
render() {
- return html`PACKAGE BUILDER `;
+ return html`
+
+ ${this.#renderHeader()}
+ ${this.#renderEditors()}
+ ${this.#renderActions()}
+
+ `;
+ }
+
+ #renderHeader() {
+ return html``;
+ }
+
+ #renderActions() {
+ return html`
+ ${this._package?.key
+ ? html`
+ Download
+ `
+ : nothing}
+
+ Save
+
+
`;
+ }
+
+ #renderEditors() {
+ return html`
+ ${this.#renderContentSection()}
+
+
+ ${this.#renderMediaSection()}
+
+
+
+ ${this.#renderDocumentTypeSection()}
+
+
+
+ ${this.#renderMediaTypeSection()}
+
+
+
+ ${this.#renderLanguageSection()}
+
+
+
+ ${this.#renderDictionarySection()}
+
+
+
+ ${this.#renderDataTypeSection()}
+
+
+
+ ${this.#renderTemplateSection()}
+
+
+
+ ${this.#renderStylesheetsSection()}
+
+
+
+ ${this.#renderScriptsSection()}
+
+
+
+ ${this.#renderPartialViewSection()}
+ `;
+ }
+
+ #renderContentSection() {
+ return html`
+
+
+ (this._package.contentNodeId = (e.target as UmbInputDocumentPickerElement).selectedKeys[0])}">
+
+ (this._package.contentLoadChildNodes = e.target.checked)}">
+ Include child nodes
+
+
+ `;
+ }
+
+ #renderMediaSection() {
+ return html`
+
+
+ (this._package.mediaKeys = (
+ e.target as UmbInputMediaPickerElement
+ ).selectedKeys)}">
+ (this._package.mediaLoadChildNodes = e.target.checked)}">
+ Include child nodes
+
+
+ `;
+ }
+
+ #renderDocumentTypeSection() {
+ return html`
+
+
`;
+ }
+
+ #renderMediaTypeSection() {
+ return html`
+
+
`;
+ }
+
+ #renderLanguageSection() {
+ return html`
+ {
+ this._package.languages = (e.target as UmbInputLanguagePickerElement).selectedIsoCodes;
+ }}">
+
`;
+ }
+
+ #renderDictionarySection() {
+ return html`
+
+
`;
+ }
+
+ #renderDataTypeSection() {
+ return html`
+
+
`;
+ }
+
+ #renderTemplateSection() {
+ return html`
+
+
`;
+ }
+
+ #renderStylesheetsSection() {
+ return html`
+
+
`;
+ }
+
+ #renderScriptsSection() {
+ return html`
+
+
`;
+ }
+
+ #renderPartialViewSection() {
+ return html`
+
+
`;
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/workspace/workspace-package.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/workspace/workspace-package.element.ts
index a11b56636c..466915fa9d 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/workspace/workspace-package.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/workspace/workspace-package.element.ts
@@ -1,22 +1,55 @@
import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
import { css, html, LitElement } from 'lit';
-import { customElement } from 'lit/decorators.js';
+import { customElement, property, state } from 'lit/decorators.js';
+import { path, stripSlash } from 'router-slot';
@customElement('umb-workspace-package')
export class UmbWorkspacePackageElement extends LitElement {
static styles = [
UUITextStyles,
css`
- :host {
- display: block;
- width: 100%;
- height: 100%;
+ .header {
+ display: flex;
+ font-size: var(--uui-type-h5-size);
}
`,
];
+ @property()
+ entityKey?: string;
+
+ @state()
+ _package?: any;
+
+ connectedCallback(): void {
+ super.connectedCallback();
+ if (this.entityKey) this._getPackageData();
+ }
+
+ private _getPackageData() {
+ //TODO
+
+ this._package = {
+ key: this.entityKey,
+ name: 'A created package',
+ };
+ }
+
+ private _navigateBack() {
+ window.history.pushState({}, '', '/section/packages/view/installed');
+ }
+
+ private _renderHeader() {
+ return html``;
+ }
+
render() {
- return html`PACKAGE Workspace `;
+ return html` ${this._renderHeader()} `;
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/created-packages-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/created-packages-section-view.element.ts
index 24d577c5be..44beef5a18 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/created-packages-section-view.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/created-packages-section-view.element.ts
@@ -1,8 +1,8 @@
-import { html } from 'lit';
+import { css, html } from 'lit';
import { customElement, state } from 'lit/decorators.js';
import { IRoute, IRoutingInfo } from 'router-slot';
-import type { ManifestWorkspace } from '@umbraco-cms/models';
-import { createExtensionElement , umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
+import type { ManifestTree, ManifestWorkspace } from '@umbraco-cms/models';
+import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
import { UmbLitElement } from '@umbraco-cms/element';
@customElement('umb-created-packages-section-view')
@@ -12,9 +12,10 @@ export class UmbCreatedPackagesSectionViewElement extends UmbLitElement {
private _workspaces: Array = [];
+ private _trees: Array = [];
+
constructor() {
super();
-
this.observe(umbExtensionsRegistry?.extensionsOfType('workspace'), (workspaceExtensions) => {
this._workspaces = workspaceExtensions;
this._createRoutes();
@@ -48,7 +49,7 @@ export class UmbCreatedPackagesSectionViewElement extends UmbLitElement {
routes.push({
path: '**',
- redirectTo: 'section/packages/view/created/overview', //TODO: this should be dynamic
+ redirectTo: 'overview',
});
this._routes = routes;
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-item.element.ts
deleted file mode 100644
index 941a137a86..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-item.element.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { html, LitElement } from 'lit';
-import { customElement, property } from 'lit/decorators.js';
-
-@customElement('umb-packages-created-item')
-export class UmbPackagesCreatedItem extends LitElement {
- @property({ type: Object })
- package!: any;
-
- render() {
- return html`
-
- `;
- }
-
- private _onClick() {
- window.history.pushState({}, '', `/section/packages/view/created/packageBuilder/${this.package.key}`);
- }
-}
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-packages-created-item': UmbPackagesCreatedItem;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts
index b57d787db1..20b33ad3f8 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts
@@ -1,35 +1,158 @@
-import { html, LitElement } from 'lit';
+import { html, css, nothing } from 'lit';
+import { ifDefined } from 'lit/directives/if-defined.js';
import { customElement, state } from 'lit/decorators.js';
import { repeat } from 'lit/directives/repeat.js';
-
-import './packages-created-item.element';
+import { UUIPaginationEvent } from '@umbraco-ui/uui';
+import { PackageDefinitionModel, PackageResource } from '@umbraco-cms/backend-api';
+import { UmbLitElement } from '@umbraco-cms/element';
+import { tryExecuteAndNotify } from '@umbraco-cms/resources';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/modal';
@customElement('umb-packages-created-overview')
-export class UmbPackagesCreatedOverviewElement extends LitElement {
- // TODO: implement call to backend
- // TODO: add correct model for created packages
- @state()
- private _createdPackages: any[] = [
- {
- alias: 'my.package',
- key: '2a0181ec-244b-4068-a1d7-2f95ed7e6da6',
- name: 'A created package',
- plans: [],
- version: '1.0.0',
- },
+export class UmbPackagesCreatedOverviewElement extends UmbLitElement {
+ static styles = [
+ css`
+ :host {
+ display: block;
+ margin: var(--uui-size-layout-1);
+ }
+ uui-box {
+ margin: var(--uui-size-space-5) 0;
+ padding-bottom: var(--uui-size-space-1);
+ }
+
+ .no-packages {
+ display: flex;
+ justify-content: space-around;
+ }
+ uui-pagination {
+ display: inline-block;
+ }
+
+ .pagination,
+ .loading {
+ display: flex;
+ justify-content: center;
+ }
+ `,
];
+ private take = 20;
+
+ @state()
+ private _loading = true;
+
+ @state()
+ private _createdPackages: PackageDefinitionModel[] = [];
+
+ @state()
+ private _currentPage = 1;
+
+ @state()
+ private _total?: number;
+
+ private _modalContext?: UmbModalContext;
+
+ constructor() {
+ super();
+ }
+
+ connectedCallback(): void {
+ super.connectedCallback();
+ this.#getPackages();
+
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
+ });
+ }
+
+ async #getPackages() {
+ const skip = this._currentPage * this.take - this.take;
+ const { data } = await tryExecuteAndNotify(this, PackageResource.getPackageCreated({ skip, take: this.take }));
+ if (data) {
+ this._total = data.total;
+ this._createdPackages = data.items;
+ }
+ this._loading = false;
+ }
+
+ #createNewPackage() {
+ window.history.pushState({}, '', `/section/packages/view/created/package-builder`);
+ }
+
render() {
- return html`
+ return html`
+ Create package
+
+ ${this._loading ? html`` : this.#renderCreatedPackages()}
+ ${this.#renderPagination()}`;
+ }
+
+ #renderCreatedPackages() {
+ if (!this._createdPackages.length) return html`No packages have been created yet
`;
+
+ return html`
${repeat(
this._createdPackages,
(item) => item.key,
- (item) => html``
+ (item) => this.#renderPackageItem(item)
)}
`;
}
+
+ #renderPackageItem(p: PackageDefinitionModel) {
+ return html` this.#packageBuilder(p)}">
+
+ this.#deletePackage(p)} label="Delete package">
+
+
+
+ `;
+ }
+
+ #packageBuilder(p: PackageDefinitionModel) {
+ if (!p.key) return;
+ window.history.pushState({}, '', `/section/packages/view/created/package-builder/${p.key}`);
+ }
+
+ #renderPagination() {
+ if (!this._total) return nothing;
+ const totalPages = Math.ceil(this._total / this.take);
+ if (totalPages <= 1) return nothing;
+ return html``;
+ }
+
+ #onPageChange(event: UUIPaginationEvent) {
+ if (this._currentPage === event.target.current) return;
+ this._currentPage = event.target.current;
+ this.#getPackages();
+ }
+
+ async #deletePackage(p: PackageDefinitionModel) {
+ if (!p.key) return;
+ const modalHandler = this._modalContext?.confirm({
+ color: 'danger',
+ headline: `Remove ${p.name}?`,
+ content: 'Are you sure you want to delete this package',
+ confirmLabel: 'Delete',
+ });
+
+ const deleteConfirmed = await modalHandler?.onClose().then(({ confirmed }: any) => {
+ return confirmed;
+ });
+
+ if (!deleteConfirmed == true) return;
+
+ const { error } = await tryExecuteAndNotify(this, PackageResource.deletePackageCreatedByKey({ key: p.key }));
+ if (error) return;
+ const index = this._createdPackages.findIndex((x) => x.key === p.key);
+ this._createdPackages.splice(index, 1);
+ this.requestUpdate();
+ }
}
export default UmbPackagesCreatedOverviewElement;
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts
index 23025cb334..3df5afd999 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts
@@ -1,37 +1,64 @@
-import { html, nothing } from 'lit';
-import { customElement, property, state } from 'lit/decorators.js';
+import { html, css, nothing } from 'lit';
import { ifDefined } from 'lit/directives/if-defined.js';
+import { customElement, property, state } from 'lit/decorators.js';
import { firstValueFrom, map } from 'rxjs';
+import { UUIButtonState } from '@umbraco-ui/uui';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../../core/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '../../../../../core/modal';
import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
-import type { ManifestPackageView, UmbPackage } from '@umbraco-cms/models';
+import type { ManifestPackageView } from '@umbraco-cms/models';
import { UmbLitElement } from '@umbraco-cms/element';
+import { tryExecuteAndNotify } from '@umbraco-cms/resources';
+import { PackageResource } from '@umbraco-cms/backend-api';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
@customElement('umb-installed-packages-section-view-item')
-export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement {
- @property({ type: Object })
- package!: UmbPackage;
+export class UmbInstalledPackagesSectionViewItem extends UmbLitElement {
+ static styles = css`
+ :host {
+ display: flex;
+ min-height: 47px;
+ }
+ `;
+
+ @property()
+ name?: string;
+
+ @property()
+ version?: string;
+
+ @property()
+ hasPendingMigrations = false;
+
+ @property()
+ customIcon?: string;
+
+ @state()
+ private _migrationButtonState?: UUIButtonState;
@state()
private _packageView?: ManifestPackageView;
- private _umbModalService?: UmbModalService;
+ private _notificationContext?: UmbNotificationContext;
+ private _modalContext?: UmbModalContext;
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (modalService) => {
- this._umbModalService = modalService;
+ this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this._notificationContext = instance;
+ });
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
});
}
connectedCallback(): void {
super.connectedCallback();
- if (this.package.name?.length) {
- this.findPackageView(this.package.name);
+ if (this.name?.length) {
+ this.findPackageView(this.name);
}
}
@@ -52,18 +79,51 @@ export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement {
this._packageView = views[0];
}
+ async _onMigration() {
+ if (!this.name) return;
+ const modalHandler = this._modalContext?.confirm({
+ color: 'positive',
+ headline: `Run migrations for ${this.name}?`,
+ content: `Do you want to start run migrations for ${this.name}`,
+ confirmLabel: 'Run migrations',
+ });
+
+ const migrationConfirmed = await modalHandler?.onClose().then(({ confirmed }: any) => {
+ return confirmed;
+ });
+
+ if (!migrationConfirmed == true) return;
+ this._migrationButtonState = 'waiting';
+ const { error } = await tryExecuteAndNotify(
+ this,
+ PackageResource.postPackageByNameRunMigration({ name: this.name })
+ );
+ if (error) return;
+ this._notificationContext?.peek('positive', { data: { message: 'Migrations completed' } });
+ this._migrationButtonState = 'success';
+ this.hasPendingMigrations = false;
+ }
+
render() {
return html`
-
-
- ${this._packageView
+
+ ${this.customIcon ? html`` : nothing}
+
+ ${this.hasPendingMigrations
? html``
+ label="Run pending package migrations">
+ Run pending migrations
+ `
: nothing}
-
+
`;
}
@@ -81,12 +141,16 @@ export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement {
return;
}
- this._umbModalService?.open(element, { data: this.package, size: 'small', type: 'sidebar' });
+ this._modalContext?.open(element, {
+ data: { name: this.name, version: this.version },
+ size: 'full',
+ type: 'sidebar',
+ });
}
}
declare global {
interface HTMLElementTagNameMap {
- 'umb-installed-packages-section-view-item': UmbInstalledPackagesSectionViewItemElement;
+ 'umb-installed-packages-section-view-item': UmbInstalledPackagesSectionViewItem;
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts
index 256760912e..08449e0cad 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts
@@ -1,23 +1,56 @@
-import { html } from 'lit';
+import { html, css, nothing } from 'lit';
import { customElement, state } from 'lit/decorators.js';
import { repeat } from 'lit/directives/repeat.js';
+import { combineLatest } from 'rxjs';
+import { UUITextStyles } from '@umbraco-ui/uui-css';
import { UmbPackageRepository } from '../../../repository/package.repository';
-import type { UmbPackage } from '@umbraco-cms/models';
import { UmbLitElement } from '@umbraco-cms/element';
+import type { UmbPackageWithMigrationStatus } from '@umbraco-cms/models';
import './installed-packages-section-view-item.element';
@customElement('umb-installed-packages-section-view')
export class UmbInstalledPackagesSectionView extends UmbLitElement {
- @state()
- private _installedPackages: UmbPackage[] = [];
+ static styles = [
+ UUITextStyles,
+ css`
+ :host {
+ display: block;
+ margin: var(--uui-size-layout-1);
+ }
+ uui-box {
+ margin-top: var(--uui-size-space-5);
+ padding-bottom: var(--uui-size-space-1);
+ }
- private repository: UmbPackageRepository;
+ umb-installed-packages-section-view-item {
+ padding: var(--uui-size-space-3) 0 var(--uui-size-space-2);
+ }
+
+ umb-installed-packages-section-view-item:not(:first-child) {
+ border-top: 1px solid var(--uui-color-border, #d8d7d9);
+ }
+
+ .no-packages {
+ display: flex;
+ justify-content: space-around;
+ flex-direction: column;
+ align-items: center;
+ }
+ `,
+ ];
+
+ @state()
+ private _installedPackages: UmbPackageWithMigrationStatus[] = [];
+
+ @state()
+ private _migrationPackages: UmbPackageWithMigrationStatus[] = [];
+
+ #packageRepository: UmbPackageRepository;
constructor() {
super();
-
- this.repository = new UmbPackageRepository(this);
+ this.#packageRepository = new UmbPackageRepository(this);
}
firstUpdated() {
@@ -28,20 +61,77 @@ export class UmbInstalledPackagesSectionView extends UmbLitElement {
* Fetch the installed packages from the server
*/
private async _loadInstalledPackages() {
- const package$ = await this.repository.rootItems();
- package$.subscribe((packages) => {
- this._installedPackages = packages.filter((p) => !!p.name);
+ const data = await Promise.all([this.#packageRepository.rootItems(), this.#packageRepository.migrations()]);
+
+ const [package$, migration$] = data;
+
+ combineLatest([package$, migration$]).subscribe(([packages, migrations]) => {
+ this._installedPackages = packages.map((p) => {
+ const migration = migrations.find((m) => m.packageName === p.name);
+ if (migration) {
+ // Remove that migration from the list
+ migrations = migrations.filter((m) => m.packageName !== p.name);
+ }
+
+ return {
+ ...p,
+ hasPendingMigrations: migration?.hasPendingMigrations ?? false,
+ };
+ });
+
+ this._migrationPackages = [
+ ...migrations.map((m) => ({
+ name: m.packageName,
+ hasPendingMigrations: m.hasPendingMigrations ?? false,
+ })),
+ ];
+ /*this._installedPackages = [
+ ...this._installedPackages,
+ ...migrations.map((m) => ({
+ name: m.packageName,
+ hasPendingMigrations: m.hasPendingMigrations ?? false,
+ })),
+ ];*/
});
}
render() {
- return html`
+ if (this._installedPackages.length) return html`${this._renderCustomMigrations()} ${this._renderInstalled()} `;
+ return html`
+
No packages have been installed
+
+ Browse through the available packages using the 'Packages' icon in the top right of your screen
+
+
`;
+ }
+
+ private _renderInstalled() {
+ return html`
${repeat(
this._installedPackages,
(item) => item.name,
- (item) =>
- html``
+ (item) => html``
+ )}
+
+ `;
+ }
+
+ private _renderCustomMigrations() {
+ if (!this._migrationPackages) return;
+ return html`
+
+ ${repeat(
+ this._migrationPackages,
+ (item) => item.name,
+ (item) => html``
)}
`;
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/manifests.ts
new file mode 100644
index 0000000000..ab052945f7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/manifests.ts
@@ -0,0 +1,24 @@
+import { UmbPackageRepository } from './package.repository';
+import { UmbPackageStore } from './package.store';
+import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { ManifestStore } from '@umbraco-cms/extensions-registry';
+
+export const PACKAGE_REPOSITORY_ALIAS = 'Umb.Repository.Package';
+
+const repository: ManifestRepository = {
+ type: 'repository',
+ alias: PACKAGE_REPOSITORY_ALIAS,
+ name: 'Package Repository',
+ class: UmbPackageRepository,
+};
+
+export const PACKAGE_STORE_ALIAS = 'Umb.Store.Package';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: PACKAGE_STORE_ALIAS,
+ name: 'Package Store',
+ class: UmbPackageStore,
+};
+
+export const manifests = [store, repository];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts
index ec54c779b4..f28c63c378 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts
@@ -3,6 +3,8 @@ import { UmbPackageServerDataSource } from './sources/package.server.data';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
import { ManifestBase } from '@umbraco-cms/extensions-registry';
+import { isManifestJSType } from "@umbraco-cms/extensions-api";
+import { OpenAPI } from "@umbraco-cms/backend-api";
// TODO: Figure out if we should base stores like this on something more generic for "collections" rather than trees.
@@ -14,6 +16,7 @@ export class UmbPackageRepository {
#init!: Promise;
#packageStore?: UmbPackageStore;
#packageSource: UmbPackageServerDataSource;
+ #apiBaseUrl = OpenAPI.BASE;
constructor(host: UmbControllerHostInterface) {
this.#packageSource = new UmbPackageServerDataSource(host);
@@ -39,7 +42,8 @@ export class UmbPackageRepository {
const { data: packages } = await this.#packageSource.getRootItems();
if (packages) {
- store.appendItems(packages);
+ // Append packages to the store but only if they have a name
+ store.appendItems(packages.filter((p) => p.name?.length));
const extensions: ManifestBase[] = [];
packages.forEach((p) => {
@@ -47,6 +51,18 @@ export class UmbPackageRepository {
// Crudely validate that the extension at least follows a basic manifest structure
// Idea: Use `Zod` to validate the manifest
if (this.isManifestBase(e)) {
+
+ /**
+ * Crude check to see if extension is of type "js" since it is safe to assume we do not
+ * need to load any other types of extensions in the backoffice (we need a js file to load)
+ */
+ if (isManifestJSType(e)) {
+ // Add API base url if the js path is relative
+ if (!e.js.startsWith('http')) {
+ e.js = `${this.#apiBaseUrl}${e.js}`;
+ }
+ }
+
extensions.push(e);
}
});
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts
index f581b2045d..18120d46a9 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts
@@ -6,6 +6,8 @@ import type { ManifestBase, UmbPackage } from '@umbraco-cms/models';
import type { PackageMigrationStatusModel } from '@umbraco-cms/backend-api';
import { ArrayState } from '@umbraco-cms/observable-api';
+export const UMB_PACKAGE_STORE_TOKEN = new UmbContextToken('UmbPackageStore');
+
/**
* Store for Packages
* @export
@@ -39,7 +41,7 @@ export class UmbPackageStore extends UmbStoreBase {
* @memberof PackageStore
*/
constructor(host: UmbControllerHostInterface) {
- super(host, UmbPackageStore.name);
+ super(host, UMB_PACKAGE_STORE_TOKEN.toString());
}
/**
@@ -58,5 +60,3 @@ export class UmbPackageStore extends UmbStoreBase {
this.#migrations.append(migrations);
}
}
-
-export const UMB_PACKAGE_STORE_TOKEN = new UmbContextToken(UmbPackageStore.name);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/server-extension.controller.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/server-extension.controller.ts
index 0073576b89..74a3db7ea0 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/server-extension.controller.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/server-extension.controller.ts
@@ -1,15 +1,16 @@
import { Subject, takeUntil } from 'rxjs';
import { UmbPackageRepository } from './package.repository';
import { UmbController, UmbControllerHostInterface } from '@umbraco-cms/controller';
-import { isManifestJSType, UmbExtensionRegistry } from '@umbraco-cms/extensions-api';
+import { UmbExtensionRegistry } from '@umbraco-cms/extensions-api';
export class UmbServerExtensionController extends UmbController {
+ #host: UmbControllerHostInterface;
#unobserve = new Subject();
#repository: UmbPackageRepository;
constructor(host: UmbControllerHostInterface, private readonly extensionRegistry: UmbExtensionRegistry) {
super(host, UmbServerExtensionController.name);
-
+ this.#host = host;
this.#repository = new UmbPackageRepository(host);
}
@@ -32,13 +33,7 @@ export class UmbServerExtensionController extends UmbController {
)
.subscribe((extensions) => {
extensions.forEach((extension) => {
- /**
- * Crude check to see if extension is of type "js" since it is safe to assume we do not
- * need to load any other types of extensions in the backoffice (we need a js file to load)
- */
- if (isManifestJSType(extension)) {
- this.extensionRegistry.register(extension);
- }
+ this.extensionRegistry.register(extension, this.#host);
});
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/sources/package.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/sources/package.server.data.ts
index e2bdd212fa..251f76608c 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/sources/package.server.data.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/sources/package.server.data.ts
@@ -1,8 +1,6 @@
import { PackageResource } from '@umbraco-cms/backend-api';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
-import type { DataSourceResponse, UmbPackage } from '@umbraco-cms/models';
import { tryExecuteAndNotify } from '@umbraco-cms/resources';
-import { umbracoPath } from '@umbraco-cms/utils';
/**
* Data source for packages from the server
@@ -15,11 +13,10 @@ export class UmbPackageServerDataSource {
* Get the root items from the server
* @memberof UmbPackageServerDataSource
*/
- getRootItems(): Promise> {
- // TODO: Use real resource when available
+ getRootItems() {
return tryExecuteAndNotify(
this.host,
- fetch(umbracoPath('/package/manifest')).then((res) => res.json())
+ PackageResource.getPackageManifest()
);
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/search/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/search/index.ts
index 01360ce456..eba052d212 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/search/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/search/index.ts
@@ -4,10 +4,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
import { ManifestTypes } from '@umbraco-cms/extensions-registry';
const registerExtensions = (manifests: Array) => {
- manifests.forEach((manifest) => {
- if (umbExtensionsRegistry.isRegistered(manifest.alias)) return;
- umbExtensionsRegistry.register(manifest);
- });
+ manifests.forEach((manifest) => umbExtensionsRegistry.register(manifest));
};
registerExtensions([...searchManifests]);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/search/umb-search-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/search/umb-search-header-app.element.ts
index 9518fb409f..64a53e5e3b 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/search/umb-search-header-app.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/search/umb-search-header-app.element.ts
@@ -1,7 +1,7 @@
import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
import { css, CSSResultGroup, html } from 'lit';
import { customElement } from 'lit/decorators.js';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/modal';
import { UmbLitElement } from '@umbraco-cms/element';
@customElement('umb-search-header-app')
@@ -16,18 +16,18 @@ export class UmbSearchHeaderApp extends UmbLitElement {
`,
];
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (_instance) => {
- this._modalService = _instance;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (_instance) => {
+ this._modalContext = _instance;
});
}
#onSearchClick() {
- this._modalService?.search();
+ this._modalContext?.search();
}
render() {
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts
index abdd4e6e72..8e68ea40b5 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts
@@ -1,7 +1,7 @@
import { UmbCultureServerDataSource } from './sources/culture.server.data';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
export class UmbCultureRepository {
#init!: Promise;
@@ -9,7 +9,7 @@ export class UmbCultureRepository {
#dataSource: UmbCultureServerDataSource;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -17,8 +17,8 @@ export class UmbCultureRepository {
this.#dataSource = new UmbCultureServerDataSource(this.#host);
this.#init = Promise.all([
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
}),
]);
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts
index 0bc2ae18bd..7502a562d3 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts
@@ -1,7 +1,7 @@
import { UmbCultureRepository } from '../repository/culture.repository';
import { ManifestRepository } from 'libs/extensions-registry/repository.models';
-export const CULTURE_REPOSITORY_ALIAS = 'Umb.Repository.Cultures';
+export const CULTURE_REPOSITORY_ALIAS = 'Umb.Repository.Culture';
const repository: ManifestRepository = {
type: 'repository',
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-indexers.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-indexers.ts
index 3c33a9195b..34c20af5d2 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-indexers.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-indexers.ts
@@ -4,7 +4,7 @@ import { customElement, property, state } from 'lit/decorators.js';
import { UUIButtonState } from '@umbraco-ui/uui-button';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../../core/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '../../../../../core/modal';
import './section-view-examine-searchers';
@@ -92,13 +92,13 @@ export class UmbDashboardExamineIndexElement extends UmbLitElement {
@state()
private _loading = true;
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (_instance) => {
- this._modalService = _instance;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (_instance) => {
+ this._modalContext = _instance;
});
this._getIndexData();
@@ -120,7 +120,7 @@ export class UmbDashboardExamineIndexElement extends UmbLitElement {
}
private async _onRebuildHandler() {
- const modalHandler = this._modalService?.confirm({
+ const modalHandler = this._modalContext?.confirm({
headline: `Rebuild ${this.indexName}`,
content: html`
This will cause the index to be rebuilt.
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-searchers.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-searchers.ts
index 3b68117159..941f79b998 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-searchers.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-searchers.ts
@@ -2,7 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
import { css, html, nothing } from 'lit';
import { customElement, state, query, property } from 'lit/decorators.js';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../../core/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '../../../../../core/modal';
import { SearchResultModel, SearcherResource, FieldModel } from '@umbraco-cms/backend-api';
import { UmbLitElement } from '@umbraco-cms/element';
@@ -101,7 +101,7 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement {
`,
];
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
@property()
searcherName!: string;
@@ -120,8 +120,8 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement {
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => {
- this._modalService = instance;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
});
}
@@ -175,7 +175,7 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement {
}
private _onFieldFilterClick() {
- const modalHandler = this._modalService?.open('umb-modal-layout-fields-settings', {
+ const modalHandler = this._modalContext?.open('umb-modal-layout-fields-settings', {
type: 'sidebar',
size: 'small',
data: { ...this._exposedFields },
@@ -241,7 +241,7 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement {
look="secondary"
label="Open sidebar to see all fields"
@click="${() =>
- this._modalService?.open('umb-modal-layout-fields-viewer', {
+ this._modalContext?.open('umb-modal-layout-fields-viewer', {
type: 'sidebar',
size: 'medium',
data: { ...rowData, name: this.getSearchResultNodeName(rowData) },
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check-dashboard.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check-dashboard.context.ts
index f4c41f1cbc..73f987fdea 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check-dashboard.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check-dashboard.context.ts
@@ -35,5 +35,5 @@ export class UmbHealthCheckDashboardContext {
}
export const UMB_HEALTHCHECK_DASHBOARD_CONTEXT_TOKEN = new UmbContextToken(
- UmbHealthCheckDashboardContext.name
+ 'UmbHealthCheckDashboardContext'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check.context.ts
index c810211f9a..920af65be7 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check.context.ts
@@ -41,4 +41,4 @@ export class UmbHealthCheckContext {
}
}
-export const UMB_HEALTHCHECK_CONTEXT_TOKEN = new UmbContextToken(UmbHealthCheckContext.name);
+export const UMB_HEALTHCHECK_CONTEXT_TOKEN = new UmbContextToken('UmbHealthCheckContext');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/published-status/dashboard-published-status.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/published-status/dashboard-published-status.element.ts
index e7693ba27c..8235fd382f 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/published-status/dashboard-published-status.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/published-status/dashboard-published-status.element.ts
@@ -3,7 +3,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
import { css, html } from 'lit';
import { customElement, state } from 'lit/decorators.js';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../core/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '../../../../core/modal';
import { PublishedCacheResource } from '@umbraco-cms/backend-api';
import { tryExecuteAndNotify } from '@umbraco-cms/resources';
@@ -38,13 +38,13 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement {
@state()
private _buttonStateCollect: UUIButtonState = undefined;
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (_instance) => {
- this._modalService = _instance;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
});
}
@@ -82,7 +82,7 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement {
}
}
private async _onReloadCacheHandler() {
- const modalHandler = this._modalService?.confirm({
+ const modalHandler = this._modalContext?.confirm({
headline: 'Reload',
content: html` Trigger a in-memory and local file cache reload on all servers. `,
color: 'danger',
@@ -105,7 +105,7 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement {
}
private async _onRebuildCacheHandler() {
- const modalHandler = this._modalService?.confirm({
+ const modalHandler = this._modalContext?.confirm({
headline: 'Rebuild',
content: html` Rebuild content in cmsContentNu database table. Expensive.`,
color: 'danger',
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts
index 0c52ff35ad..e440812256 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts
@@ -8,7 +8,7 @@ import { UmbContextConsumerController } from '@umbraco-cms/context-api';
import { ProblemDetailsModel, DataTypeModel } from '@umbraco-cms/backend-api';
import type { UmbTreeRepository } from 'libs/repository/tree-repository.interface';
import { UmbDetailRepository } from '@umbraco-cms/repository';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
type ItemType = DataTypeModel;
@@ -27,7 +27,7 @@ export class UmbDataTypeRepository implements UmbTreeRepository, UmbDetailReposi
#detailDataSource: UmbDataTypeServerDataSource;
#detailStore?: UmbDataTypeStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -45,8 +45,8 @@ export class UmbDataTypeRepository implements UmbTreeRepository, UmbDetailReposi
this.#detailStore = instance;
}),
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
}),
]);
}
@@ -159,7 +159,7 @@ export class UmbDataTypeRepository implements UmbTreeRepository, UmbDetailReposi
if (!error) {
const notification = { data: { message: `Document created` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
@@ -181,7 +181,7 @@ export class UmbDataTypeRepository implements UmbTreeRepository, UmbDetailReposi
if (!error) {
const notification = { data: { message: `Document saved` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
@@ -207,7 +207,7 @@ export class UmbDataTypeRepository implements UmbTreeRepository, UmbDetailReposi
if (!error) {
const notification = { data: { message: `Document deleted` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
// TODO: we currently don't use the detail store for anything.
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts
index 4cd7c8dad1..d6d8ef2d94 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts
@@ -4,6 +4,8 @@ import { ArrayState } from '@umbraco-cms/observable-api';
import { UmbStoreBase } from '@umbraco-cms/store';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
+export const UMB_DATA_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDataTypeStore');
+
/**
* @export
* @class UmbDataTypeStore
@@ -19,7 +21,7 @@ export class UmbDataTypeStore extends UmbStoreBase {
* @memberof UmbDataTypeStore
*/
constructor(host: UmbControllerHostInterface) {
- super(host, UmbDataTypeStore.name);
+ super(host, UMB_DATA_TYPE_STORE_CONTEXT_TOKEN.toString());
}
/**
@@ -49,5 +51,3 @@ export class UmbDataTypeStore extends UmbStoreBase {
this.#data.remove(uniques);
}
}
-
-export const UMB_DATA_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken(UmbDataTypeStore.name);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.tree.store.ts
index 6cf869e5e1..a29ae02cf8 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.tree.store.ts
@@ -21,5 +21,5 @@ export class UmbDataTypeTreeStore extends UmbTreeStoreBase {
}
export const UMB_DATA_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- UmbDataTypeTreeStore.name
+ 'UmbDataTypeTreeStore'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/manifests.ts
index fbe0167037..4d54186a90 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/manifests.ts
@@ -1,13 +1,33 @@
import { UmbDataTypeRepository } from '../repository/data-type.repository';
+import { UmbDataTypeStore } from './data-type.store';
+import { UmbDataTypeTreeStore } from './data-type.tree.store';
import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/extensions-registry';
-export const DATA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DataTypes';
+export const DATA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DataType';
const repository: ManifestRepository = {
type: 'repository',
alias: DATA_TYPE_REPOSITORY_ALIAS,
- name: 'Data Types Repository',
+ name: 'Data Type Repository',
class: UmbDataTypeRepository,
};
-export const manifests = [repository];
+export const DATA_TYPE_STORE_ALIAS = 'Umb.Store.DataType';
+export const DATA_TYPE_TREE_STORE_ALIAS = 'Umb.Store.DataTypeTree';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: DATA_TYPE_STORE_ALIAS,
+ name: 'Data Type Store',
+ class: UmbDataTypeStore,
+};
+
+const treeStore: ManifestTreeStore = {
+ type: 'treeStore',
+ alias: DATA_TYPE_TREE_STORE_ALIAS,
+ name: 'Data Type Tree Store',
+ class: UmbDataTypeTreeStore,
+};
+
+export const manifests = [repository, store, treeStore];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/actions/create/action-data-type-create.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/actions/create/action-data-type-create.element.ts
deleted file mode 100644
index af2d692a69..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/actions/create/action-data-type-create.element.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { UUITextStyles } from '@umbraco-ui/uui-css';
-import { css, html } from 'lit';
-import { customElement } from 'lit/decorators.js';
-import UmbTreeItemActionElement from '../../../../../shared/components/tree/action/tree-item-action.element';
-
-@customElement('umb-tree-action-data-type-create')
-export default class UmbTreeActionDataTypeCreateElement extends UmbTreeItemActionElement {
- static styles = [UUITextStyles, css``];
-
- // TODO: how do we handle the href?
- private _constructUrl() {
- return `section/settings/${this._activeTreeItem?.type}/create/${this._activeTreeItem?.key || 'root'}`;
- }
-
- private _handleLabelClick() {
- if (!this._treeContextMenuService) return;
- this._treeContextMenuService.close();
- }
-
- render() {
- return html`
-
- `;
- }
-}
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-tree-action-data-type-create': UmbTreeActionDataTypeCreateElement;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/actions/delete/action-data-type-delete.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/actions/delete/action-data-type-delete.element.ts
deleted file mode 100644
index cfbf8ffcc5..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/actions/delete/action-data-type-delete.element.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { UUITextStyles } from '@umbraco-ui/uui-css';
-import { css, html } from 'lit';
-import { customElement } from 'lit/decorators.js';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../../../core/modal';
-import UmbTreeItemActionElement from '../../../../../shared/components/tree/action/tree-item-action.element';
-
-@customElement('umb-tree-action-data-type-delete')
-export default class UmbTreeActionDataTypeDeleteElement extends UmbTreeItemActionElement {
- static styles = [UUITextStyles, css``];
-
- private _modalService?: UmbModalService;
- //private _dataTypeStore?: UmbDataTypeStore;
-
- connectedCallback(): void {
- super.connectedCallback();
-
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (modalService) => {
- this._modalService = modalService;
- });
- }
-
- private _handleLabelClick() {
- const modalHandler = this._modalService?.confirm({
- headline: `Delete ${this._activeTreeItem?.name ?? 'item'}`,
- content: 'Are you sure you want to delete this item?',
- color: 'danger',
- confirmLabel: 'Delete',
- });
-
- modalHandler?.onClose().then(({ confirmed }: any) => {
- //TODO: Generally no one should talk to stores directly.
- /*
- if (confirmed && this._treeContextMenuService && this._dataTypeStore && this._activeTreeItem) {
- this._dataTypeStore?.delete([this._activeTreeItem.key]);
- this._treeContextMenuService.close();
- }
- */
- });
- }
-
- render() {
- return html`
-
- `;
- }
-}
-
-declare global {
- interface HTMLElementTagNameMap {
- 'umb-tree-action-data-type-delete': UmbTreeActionDataTypeDeleteElement;
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/manifests.ts
index f3a81ccab9..6d1c73262f 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/tree/manifests.ts
@@ -1,5 +1,5 @@
import { UmbDataTypeRepository } from '../repository/data-type.repository';
-import type { ManifestTree, ManifestTreeItemAction } from '@umbraco-cms/models';
+import type { ManifestTree } from '@umbraco-cms/models';
const tree: ManifestTree = {
type: 'tree',
@@ -10,31 +10,4 @@ const tree: ManifestTree = {
},
};
-const treeItemActions: Array = [
- {
- type: 'treeItemAction',
- alias: 'Umb.TreeItemAction.DataType.Create',
- name: 'Tree Item Action Create',
- loader: () => import('./actions/create/action-data-type-create.element'),
- weight: 200,
- meta: {
- entityType: 'data-type',
- label: 'Create',
- icon: 'umb:add',
- },
- },
- {
- type: 'treeItemAction',
- alias: 'Umb.TreeItemAction.DataType.Delete',
- name: 'Tree Item Action Delete',
- loader: () => import('./actions/delete/action-data-type-delete.element'),
- weight: 100,
- meta: {
- entityType: 'data-type',
- label: 'Delete',
- icon: 'umb:delete',
- },
- },
-];
-
-export const manifests = [tree, ...treeItemActions];
+export const manifests = [tree];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/data-type-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/data-type-workspace-view-edit.element.ts
index fd77adf0e6..c3495deef6 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/data-type-workspace-view-edit.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/edit/data-type-workspace-view-edit.element.ts
@@ -1,7 +1,7 @@
import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
import { css, html, nothing } from 'lit';
import { customElement, state } from 'lit/decorators.js';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../../../core/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '../../../../../../core/modal';
import { UmbDataTypeWorkspaceContext } from '../../data-type-workspace.context';
import { UmbLitElement } from '@umbraco-cms/element';
import type { DataTypeModel } from '@umbraco-cms/backend-api';
@@ -41,13 +41,13 @@ export class UmbDataTypeWorkspaceViewEditElement extends UmbLitElement {
private _data: Array = [];
private _workspaceContext?: UmbDataTypeWorkspaceContext;
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (_instance) => {
- this._modalService = _instance;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
});
// TODO: Figure out if this is the best way to consume a context or if it could be strongly typed using UmbContextToken
@@ -100,7 +100,7 @@ export class UmbDataTypeWorkspaceViewEditElement extends UmbLitElement {
private _openPropertyEditorUIPicker() {
if (!this._dataType) return;
- const modalHandler = this._modalService?.propertyEditorUIPicker({
+ const modalHandler = this._modalContext?.propertyEditorUIPicker({
selection: this._propertyEditorUiAlias ? [this._propertyEditorUiAlias] : [],
});
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts
index 563af4962a..3558e546ce 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts
@@ -3,21 +3,21 @@ import { customElement, state } from 'lit/decorators.js';
import { isManifestElementNameType, umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
import type { ManifestBase } from '@umbraco-cms/models';
import { UmbLitElement } from '@umbraco-cms/element';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/modal';
@customElement('umb-extension-root-workspace')
export class UmbExtensionRootWorkspaceElement extends UmbLitElement {
@state()
private _extensions?: Array = undefined;
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
connectedCallback(): void {
super.connectedCallback();
this._observeExtensions();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (modalService) => {
- this._modalService = modalService;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
});
}
@@ -28,7 +28,7 @@ export class UmbExtensionRootWorkspaceElement extends UmbLitElement {
}
#removeExtension(extension: ManifestBase) {
- const modalHandler = this._modalService?.confirm({
+ const modalHandler = this._modalContext?.confirm({
headline: 'Unload extension',
confirmLabel: 'Unload',
content: html`Are you sure you want to unload the extension ${extension.alias}?
`,
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/index.ts
index f566504513..ad131eb979 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/index.ts
@@ -11,10 +11,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/extensions-api';
import { ManifestTypes } from '@umbraco-cms/extensions-registry';
const registerExtensions = (manifests: Array) => {
- manifests.forEach((manifest) => {
- if (umbExtensionsRegistry.isRegistered(manifest.alias)) return;
- umbExtensionsRegistry.register(manifest);
- });
+ manifests.forEach((manifest) => umbExtensionsRegistry.register(manifest));
};
registerExtensions([
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language-select.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language-select.element.ts
index d0a2f1604d..a69f693017 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language-select.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language-select.element.ts
@@ -120,7 +120,7 @@ export class UmbAppLanguageSelectElement extends UmbLitElement {
#renderTrigger() {
return html``;
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language.context.ts
index 82c2d32649..867f876579 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language.context.ts
@@ -47,4 +47,4 @@ export class UmbAppLanguageContext {
}
}
-export const UMB_APP_LANGUAGE_CONTEXT_TOKEN = new UmbContextToken(UmbAppLanguageContext.name);
+export const UMB_APP_LANGUAGE_CONTEXT_TOKEN = new UmbContextToken('UmbAppLanguageContext');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/entity-actions/manifests.ts
index e8846b75a6..7852f3e09c 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/entity-actions/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/entity-actions/manifests.ts
@@ -1,8 +1,8 @@
+import { LANGUAGE_REPOSITORY_ALIAS } from '../repository/manifests';
import { UmbDeleteEntityAction } from '@umbraco-cms/entity-action';
import { ManifestEntityAction } from '@umbraco-cms/extensions-registry';
const entityType = 'language';
-const repositoryAlias = 'Umb.Repository.Languages';
const entityActions: Array = [
{
@@ -11,7 +11,7 @@ const entityActions: Array = [
name: 'Delete Language Entity Action',
meta: {
entityType,
- repositoryAlias,
+ repositoryAlias: LANGUAGE_REPOSITORY_ALIAS,
icon: 'umb:trash',
label: 'Delete',
api: UmbDeleteEntityAction,
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts
index 9fa8683457..ef87ea9abe 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts
@@ -2,7 +2,7 @@ import { UmbLanguageServerDataSource } from './sources/language.server.data';
import { UmbLanguageStore, UMB_LANGUAGE_STORE_CONTEXT_TOKEN } from './language.store';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { UmbContextConsumerController } from '@umbraco-cms/context-api';
-import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/notification';
import { LanguageModel, ProblemDetailsModel } from '@umbraco-cms/backend-api';
export class UmbLanguageRepository {
@@ -13,7 +13,7 @@ export class UmbLanguageRepository {
#dataSource: UmbLanguageServerDataSource;
#languageStore?: UmbLanguageStore;
- #notificationService?: UmbNotificationService;
+ #notificationContext?: UmbNotificationContext;
constructor(host: UmbControllerHostInterface) {
this.#host = host;
@@ -21,13 +21,13 @@ export class UmbLanguageRepository {
this.#dataSource = new UmbLanguageServerDataSource(this.#host);
this.#init = Promise.all([
- new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
- this.#notificationService = instance;
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this.#notificationContext = instance;
}),
new UmbContextConsumerController(this.#host, UMB_LANGUAGE_STORE_CONTEXT_TOKEN, (instance) => {
this.#languageStore = instance;
- }),
+ }).asPromise(),
]);
}
@@ -92,7 +92,7 @@ export class UmbLanguageRepository {
if (!error) {
this.#languageStore?.append(language);
const notification = { data: { message: `Language created` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
return { error };
@@ -111,7 +111,7 @@ export class UmbLanguageRepository {
if (!error) {
const notification = { data: { message: `Language saved` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
this.#languageStore?.append(language);
}
@@ -137,7 +137,7 @@ export class UmbLanguageRepository {
if (!error) {
this.#languageStore?.remove([isoCode]);
const notification = { data: { message: `Language deleted` } };
- this.#notificationService?.peek('positive', notification);
+ this.#notificationContext?.peek('positive', notification);
}
return { error };
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts
index 7f13331aca..3da9a5a38a 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts
@@ -4,6 +4,8 @@ import { UmbControllerHostInterface } from '@umbraco-cms/controller';
import { ArrayState } from '@umbraco-cms/observable-api';
import { LanguageModel } from '@umbraco-cms/backend-api';
+export const UMB_LANGUAGE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbLanguageStore');
+
/**
* @export
* @class UmbLanguageStore
@@ -15,7 +17,7 @@ export class UmbLanguageStore extends UmbStoreBase {
data = this.#data.asObservable();
constructor(host: UmbControllerHostInterface) {
- super(host, UmbLanguageStore.name);
+ super(host, UMB_LANGUAGE_STORE_CONTEXT_TOKEN.toString());
}
append(language: LanguageModel) {
@@ -32,4 +34,3 @@ export class UmbLanguageStore extends UmbStoreBase {
}
}
-export const UMB_LANGUAGE_STORE_CONTEXT_TOKEN = new UmbContextToken(UmbLanguageStore.name);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/manifests.ts
index 7020f13c22..a69836165b 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/manifests.ts
@@ -1,7 +1,9 @@
import { UmbLanguageRepository } from '../repository/language.repository';
+import { UmbLanguageStore } from './language.store';
import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+import { ManifestStore } from '@umbraco-cms/extensions-registry';
-export const LANGUAGE_REPOSITORY_ALIAS = 'Umb.Repository.Languages';
+export const LANGUAGE_REPOSITORY_ALIAS = 'Umb.Repository.Language';
const repository: ManifestRepository = {
type: 'repository',
@@ -10,4 +12,13 @@ const repository: ManifestRepository = {
class: UmbLanguageRepository,
};
-export const manifests = [repository];
+export const LANGUAGE_STORE_ALIAS = 'Umb.Store.Language';
+
+const store: ManifestStore = {
+ type: 'store',
+ alias: LANGUAGE_STORE_ALIAS,
+ name: 'Language Store',
+ class: UmbLanguageStore,
+};
+
+export const manifests = [repository, store];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts
index 27e008d1bf..7ad8352aa4 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts
@@ -175,5 +175,5 @@ export class UmbCollectionContext<
}
export const UMB_COLLECTION_CONTEXT_TOKEN = new UmbContextToken>(
- UmbCollectionContext.name
+ 'UmbCollectionContext'
);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts
index 1bc842424b..cd352e751b 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts
@@ -77,7 +77,7 @@ export class UmbBackofficeMain extends UmbLitElement {
}
private _onRouteChange = (event: UmbRouterSlotChangeEvent) => {
- const currentPath = event.target.localActiveViewPath || ''
+ const currentPath = event.target.localActiveViewPath || '';
const section = this._sections.find((s) => this._routePrefix + s.meta.pathname === currentPath);
if (!section) return;
this._backofficeContext?.setActiveSectionAlias(section.alias);
@@ -94,11 +94,7 @@ export class UmbBackofficeMain extends UmbLitElement {
}
render() {
- return html`
- `;
+ return html` `;
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-modal-container.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-modal-container.element.ts
index 49298c46ed..1ad3d99bf3 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-modal-container.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-modal-container.element.ts
@@ -2,7 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
import { css, CSSResultGroup, html } from 'lit';
import { customElement, state } from 'lit/decorators.js';
import { repeat } from 'lit/directives/repeat.js';
-import { UmbModalHandler, UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../core/modal';
+import { UmbModalHandler, UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '../../../../core/modal';
import { UmbLitElement } from '@umbraco-cms/element';
@customElement('umb-backoffice-modal-container')
@@ -19,21 +19,21 @@ export class UmbBackofficeModalContainer extends UmbLitElement {
@state()
private _modals?: UmbModalHandler[];
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (modalService) => {
- this._modalService = modalService;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
this._observeModals();
});
}
private _observeModals() {
- if (!this._modalService) return;
+ if (!this._modalContext) return;
- this.observe(this._modalService.modals, (modals) => {
+ this.observe(this._modalContext.modals, (modals) => {
this._modals = modals;
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-notification-container.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-notification-container.element.ts
index c222b88208..eb5268301e 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-notification-container.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-notification-container.element.ts
@@ -4,8 +4,8 @@ import { customElement, state } from 'lit/decorators.js';
import { repeat } from 'lit/directives/repeat.js';
import {
UmbNotificationHandler,
- UmbNotificationService,
- UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN,
+ UmbNotificationContext,
+ UMB_NOTIFICATION_CONTEXT_TOKEN,
} from '@umbraco-cms/notification';
import { UmbLitElement } from '@umbraco-cms/element';
@@ -29,21 +29,21 @@ export class UmbBackofficeNotificationContainer extends UmbLitElement {
@state()
private _notifications?: UmbNotificationHandler[];
- private _notificationService?: UmbNotificationService;
+ private _notificationContext?: UmbNotificationContext;
constructor() {
super();
- this.consumeContext(UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (notificationService) => {
- this._notificationService = notificationService;
+ this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => {
+ this._notificationContext = instance;
this._observeNotifications();
});
}
private _observeNotifications() {
- if (!this._notificationService) return;
+ if (!this._notificationContext) return;
- this.observe(this._notificationService.notifications, (notifications) => {
+ this.observe(this._notificationContext.notifications, (notifications) => {
this._notifications = notifications;
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
index 195e409e60..ae75471fe0 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
@@ -3,7 +3,7 @@ import { css, html, nothing, TemplateResult } from 'lit';
import { customElement, property, state } from 'lit/decorators.js';
import { UmbContextDebugRequest } from '@umbraco-cms/context-api';
import { UmbLitElement } from '@umbraco-cms/element';
-import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal';
+import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/modal';
@customElement('umb-debug')
export class UmbDebug extends UmbLitElement {
@@ -64,12 +64,12 @@ export class UmbDebug extends UmbLitElement {
@state()
private _debugPaneOpen = false;
- private _modalService?: UmbModalService;
+ private _modalContext?: UmbModalContext;
constructor() {
super();
- this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (modalService) => {
- this._modalService = modalService;
+ this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => {
+ this._modalContext = instance;
});
}
@@ -102,10 +102,10 @@ export class UmbDebug extends UmbLitElement {
}
private _openDialog() {
- this._modalService?.openBasic({
+ this._modalContext?.openBasic({
header: html` Debug: Contexts`,
content: this._htmlContent(),
- overlaySize: 'small'
+ overlaySize: 'small',
});
}
@@ -125,15 +125,13 @@ export class UmbDebug extends UmbLitElement {
-
- ${this._htmlContent()}
-
+
${this._htmlContent()}
`;
}
private _htmlContent() {
- return html `
+ return html`