-
-
${this.item?.name}
+
+ ${this.item?.icon
+ ? html`
+
+ `
+ : nothing}
`;
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts
index 8b78c6586f..0bba8e6432 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts
@@ -43,6 +43,9 @@ export class UmbTreeItemBaseElement extends UmbLitElement {
@state()
private _hasChildren = false;
+ @state()
+ private _iconSlotHasChildren = false;
+
#treeItemContext?: UmbTreeItemContextBase;
constructor() {
@@ -108,14 +111,32 @@ export class UmbTreeItemBaseElement extends UmbLitElement {
.hasChildren=${this._hasChildren}
label="${ifDefined(this.item?.name)}"
href="${ifDefined(this._href)}">
- ${this.#renderIcon()} ${this.#renderActions()} ${this.#renderChildItems()}
+ ${this.#renderIcon()} ${this.#renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()}
`;
}
+ #hasNodes = (e: Event) => {
+ return (e.target as HTMLSlotElement).assignedNodes({ flatten: true }).length > 0;
+ };
+
#renderIcon() {
- return html` ${this.item?.icon ? html`
` : nothing} `;
+ return html`
+
{
+ this._iconSlotHasChildren = this.#hasNodes(e);
+ }}>
+ ${this.item?.icon && !this._iconSlotHasChildren
+ ? html`
`
+ : nothing}
+ `;
+ }
+
+ #renderLabel() {
+ return html`
`;
}
#renderActions() {
From dca92f46460c8812205ce6870ded74134a7fef01 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Thu, 23 Mar 2023 14:24:50 +0100
Subject: [PATCH 027/114] temp document tree item label
---
.../tree-item/document-tree-item.element.ts | 27 +++++++++++++------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.element.ts
index c24c2ddb03..68ab99af32 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.element.ts
@@ -39,17 +39,28 @@ export class UmbDocumentTreeItemElement extends UmbLitElement {
new UmbDocumentTreeItemContext(this, this.item);
return html`
-
-
- ${this.item?.icon
- ? html`
-
- `
- : nothing}
-
+ ${this.#renderIconWithStatusSymbol()} ${this.#renderLabel()}
`;
}
+
+ // TODO: implement correct status symbol
+ #renderIconWithStatusSymbol() {
+ return html`
+
+ ${this.item?.icon
+ ? html`
+
+ `
+ : nothing}
+
+ `;
+ }
+
+ // TODO: lower opacity if item is not published
+ #renderLabel() {
+ return html` ${this.item?.name} `;
+ }
}
export default UmbDocumentTreeItemElement;
From 1aef861c91bdf0dfde5a3992971c083a6fa0c18a Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Thu, 23 Mar 2023 14:39:33 +0100
Subject: [PATCH 028/114] set has children to false
---
src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts
index a99805afe0..49e4d48e49 100644
--- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts
+++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts
@@ -516,7 +516,7 @@ export const treeData: Array = [
name: 'All property editors',
type: 'document',
icon: 'document',
- hasChildren: true,
+ hasChildren: false,
},
{
$type: 'DocumentTreeItemViewModel',
From b3c2bace803a172488289eed407ceca60dfc6ff0 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 09:36:23 +0100
Subject: [PATCH 029/114] make tree store a generic
---
.../libs/store/tree-store-base.ts | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts b/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts
index 7b2f35893e..8a7647d015 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts
@@ -9,25 +9,27 @@ import { UmbStoreBase } from '@umbraco-cms/backoffice/store';
* @description - General Tree Data Store
*/
// TODO: consider if tree store could be turned into a general EntityTreeStore class?
-export class UmbTreeStoreBase extends UmbStoreBase {
- #data = new ArrayState([], (x) => x.key);
+export class UmbTreeStoreBase<
+ T extends EntityTreeItemResponseModel = EntityTreeItemResponseModel
+> extends UmbStoreBase {
+ #data = new ArrayState([], (x) => x.key);
/**
* Appends items to the store
- * @param {Array} items
+ * @param {Array} items
* @memberof UmbTreeStoreBase
*/
- appendItems(items: Array) {
+ appendItems(items: Array) {
this.#data.append(items);
}
/**
* Updates an item in the store
* @param {string} key
- * @param {Partial} data
+ * @param {Partial} data
* @memberof UmbTreeStoreBase
*/
- updateItem(key: string, data: Partial) {
+ updateItem(key: string, data: Partial) {
this.#data.next(partialUpdateFrozenArray(this.#data.getValue(), data, (entry) => entry.key === key));
}
From 0dcbd7b5e72d7d79fdbfdec4e5afd337dcbf9e53 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 09:37:11 +0100
Subject: [PATCH 030/114] make tree data source a generic
---
.../repository/repository-tree-data-source.interface.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/repository/repository-tree-data-source.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/repository-tree-data-source.interface.ts
index c131d41fff..5c8290dd11 100644
--- a/src/Umbraco.Web.UI.Client/libs/repository/repository-tree-data-source.interface.ts
+++ b/src/Umbraco.Web.UI.Client/libs/repository/repository-tree-data-source.interface.ts
@@ -1,8 +1,8 @@
import { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository';
-export interface RepositoryTreeDataSource {
- getRootItems(): Promise>;
- getChildrenOf(parentKey: string): Promise>;
+export interface RepositoryTreeDataSource {
+ getRootItems(): Promise>;
+ getChildrenOf(parentKey: string): Promise>;
getItems(key: Array): Promise>;
}
From bc350d07af7c13e89755788c7c6b83d255d40dc6 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 09:38:02 +0100
Subject: [PATCH 031/114] add stylesheet request interceptors
---
.../core/mocks/domains/stylesheet.handlers.ts | 34 +++++++++++++++++++
1 file changed, 34 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/core/mocks/domains/stylesheet.handlers.ts
diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/stylesheet.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/stylesheet.handlers.ts
new file mode 100644
index 0000000000..b7ddf60b0c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/stylesheet.handlers.ts
@@ -0,0 +1,34 @@
+import { rest } from 'msw';
+import { umbStylesheetData } from '../data/stylesheet.data';
+import { umbracoPath } from '@umbraco-cms/backoffice/utils';
+
+export const handlers = [
+ rest.get(umbracoPath('/tree/stylesheet/root'), (req, res, ctx) => {
+ const response = umbStylesheetData.getTreeRoot();
+ return res(ctx.status(200), ctx.json(response));
+ }),
+
+ rest.get(umbracoPath('/tree/stylesheet/children'), (req, res, ctx) => {
+ const path = req.url.searchParams.get('path');
+ if (!path) return;
+
+ const response = umbStylesheetData.getTreeItemChildren(path);
+ return res(ctx.status(200), ctx.json(response));
+ }),
+
+ rest.get(umbracoPath('/tree/stylesheet/item'), (req, res, ctx) => {
+ const paths = req.url.searchParams.getAll('paths');
+ if (!paths) return;
+
+ const items = umbStylesheetData.getTreeItem(paths);
+ return res(ctx.status(200), ctx.json(items));
+ }),
+
+ rest.get(umbracoPath('/stylesheet/:path'), (req, res, ctx) => {
+ const path = req.params.path as string;
+ if (!path) return;
+
+ const response = umbStylesheetData.getByPath(path);
+ return res(ctx.status(200), ctx.json(response));
+ }),
+];
From 4c40a661e5ec063416787e0bd1ce3caac3c5e566 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 09:57:05 +0100
Subject: [PATCH 032/114] remove unused handler
---
.../src/core/mocks/domains/stylesheet.handlers.ts | 8 --------
1 file changed, 8 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/stylesheet.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/stylesheet.handlers.ts
index b7ddf60b0c..ef252a199e 100644
--- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/stylesheet.handlers.ts
+++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/stylesheet.handlers.ts
@@ -23,12 +23,4 @@ export const handlers = [
const items = umbStylesheetData.getTreeItem(paths);
return res(ctx.status(200), ctx.json(items));
}),
-
- rest.get(umbracoPath('/stylesheet/:path'), (req, res, ctx) => {
- const path = req.params.path as string;
- if (!path) return;
-
- const response = umbStylesheetData.getByPath(path);
- return res(ctx.status(200), ctx.json(response));
- }),
];
From e1e4df2c4516724c76876b568f653a2f4ceda844 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 09:57:18 +0100
Subject: [PATCH 033/114] import stylesheet handlers
---
src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts
index 1219928040..a756d4c727 100644
--- a/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts
+++ b/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts
@@ -28,6 +28,7 @@ import { handlers as redirectManagementHandlers } from './domains/redirect-manag
import { handlers as logViewerHandlers } from './domains/log-viewer.handlers';
import { handlers as packageHandlers } from './domains/package.handlers';
import { handlers as rteEmbedHandlers } from './domains/rte-embed.handlers';
+import { handlers as stylesheetHandlers } from './domains/stylesheet.handlers';
const handlers = [
serverHandlers.serverVersionHandler,
@@ -59,6 +60,7 @@ const handlers = [
...logViewerHandlers,
...packageHandlers,
...rteEmbedHandlers,
+ ...stylesheetHandlers,
];
switch (import.meta.env.VITE_UMBRACO_INSTALL_STATUS) {
From 4cfcd21364c23888a660fcf80333766b03ef9c71 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 09:57:41 +0100
Subject: [PATCH 034/114] add mocked stylesheet data + mocked db
---
.../src/core/mocks/data/stylesheet.data.ts | 80 +++++++++++++++++++
.../src/core/mocks/data/utils.ts | 12 ++-
2 files changed, 91 insertions(+), 1 deletion(-)
create mode 100644 src/Umbraco.Web.UI.Client/src/core/mocks/data/stylesheet.data.ts
diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/stylesheet.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/stylesheet.data.ts
new file mode 100644
index 0000000000..96da26036b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/stylesheet.data.ts
@@ -0,0 +1,80 @@
+import { UmbEntityData } from './entity.data';
+import { createFileSystemTreeItem } from './utils';
+import {
+ FileSystemTreeItemPresentationModel,
+ PagedFileSystemTreeItemPresentationModel,
+} from '@umbraco-cms/backoffice/backend-api';
+
+type StylesheetDBItem = FileSystemTreeItemPresentationModel & {
+ content: string;
+};
+
+export const data: Array = [
+ {
+ path: 'Stylesheet File 1.css',
+ isFolder: false,
+ name: 'Stylesheet File 1.css',
+ type: 'stylesheet',
+ icon: 'icon-brackets',
+ hasChildren: false,
+ content: `Stylesheet content 1`,
+ },
+ {
+ path: 'Stylesheet File 2.css',
+ isFolder: false,
+ name: 'Stylesheet File 2.css',
+ type: 'stylesheet',
+ icon: 'icon-brackets',
+ hasChildren: false,
+ content: `Stylesheet content 2`,
+ },
+ {
+ path: 'Folder 1',
+ isFolder: true,
+ name: 'Folder 1',
+ type: 'stylesheet',
+ icon: 'icon-folder',
+ hasChildren: false,
+ content: `Stylesheet content 3`,
+ },
+ {
+ path: 'Folder 1/Stylesheet File 3.css',
+ isFolder: false,
+ name: 'Stylesheet File 3.css',
+ type: 'stylesheet',
+ icon: 'icon-brackets',
+ hasChildren: false,
+ content: `Stylesheet content 3`,
+ },
+];
+
+// Temp mocked database
+// TODO: all properties are optional in the server schema. I don't think this is correct.
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
+class UmbStylesheetData extends UmbEntityData {
+ constructor() {
+ super(data);
+ }
+
+ getTreeRoot(): PagedFileSystemTreeItemPresentationModel {
+ const items = this.data.filter((item) => item.path === item.name);
+ const treeItems = items.map((item) => createFileSystemTreeItem(item));
+ const total = items.length;
+ return { items: treeItems, total };
+ }
+
+ getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel {
+ const items = this.data.filter((item) => item.path?.startsWith(parentPath));
+ const treeItems = items.map((item) => createFileSystemTreeItem(item));
+ const total = items.length;
+ return { items: treeItems, total };
+ }
+
+ getTreeItem(paths: Array): Array {
+ const items = this.data.filter((item) => paths.includes(item.path ?? ''));
+ return items.map((item) => createFileSystemTreeItem(item));
+ }
+}
+
+export const umbStylesheetData = new UmbStylesheetData();
diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/utils.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/utils.ts
index 257b43976e..325e8e46b0 100644
--- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/utils.ts
+++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/utils.ts
@@ -6,6 +6,7 @@ import type {
FolderTreeItemResponseModel,
DocumentTypeResponseModel,
DocumentResponseModel,
+ FileSystemTreeItemPresentationModel,
} from '@umbraco-cms/backoffice/backend-api';
export const createEntityTreeItem = (item: any): EntityTreeItemResponseModel => {
@@ -38,7 +39,9 @@ export const createContentTreeItem = (item: any): ContentTreeItemResponseModel &
};
// TODO: remove isTrashed type extension when we have found a solution to trashed items
-export const createDocumentTreeItem = (item: DocumentResponseModel): DocumentTreeItemResponseModel & { isTrashed: boolean } => {
+export const createDocumentTreeItem = (
+ item: DocumentResponseModel
+): DocumentTreeItemResponseModel & { isTrashed: boolean } => {
return {
...createContentTreeItem(item),
/*
@@ -57,3 +60,10 @@ export const createDocumentTypeTreeItem = (item: DocumentTypeResponseModel): Doc
isElement: item.isElement,
};
};
+
+export const createFileSystemTreeItem = (item: any): FileSystemTreeItemPresentationModel => {
+ return {
+ ...createFolderTreeItem(item),
+ path: item.path,
+ };
+};
From 6ee46fcc6f093ce80f2dd51b24e4f89b9e55b79e Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:10:55 +0100
Subject: [PATCH 035/114] update types in tree repository interface
---
.../repository/tree-repository.interface.ts | 33 +++++++++++--------
1 file changed, 20 insertions(+), 13 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts
index a1de9f88ba..6d57205da4 100644
--- a/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts
+++ b/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts
@@ -1,24 +1,31 @@
import type { Observable } from 'rxjs';
-import { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api';
+import {
+ EntityTreeItemResponseModel,
+ PagedEntityTreeItemResponseModel,
+ ProblemDetailsModel,
+} from '@umbraco-cms/backoffice/backend-api';
-export interface UmbTreeRepository {
+export interface UmbTreeRepository<
+ PagedItemsType = PagedEntityTreeItemResponseModel,
+ ItemsType = EntityTreeItemResponseModel
+> {
requestRootTreeItems: () => Promise<{
- data: PagedEntityTreeItemResponseModel | undefined;
+ data: PagedItemsType | undefined;
error: ProblemDetailsModel | undefined;
- asObservable?: () => Observable;
+ asObservable?: () => Observable;
}>;
- requestTreeItemsOf: (parentKey: string | null) => Promise<{
- data: PagedEntityTreeItemResponseModel | undefined;
+ requestTreeItemsOf: (parentUnique: string | null) => Promise<{
+ data: PagedItemsType | undefined;
error: ProblemDetailsModel | undefined;
- asObservable?: () => Observable;
+ asObservable?: () => Observable;
}>;
- requestTreeItems: (keys: string[]) => Promise<{
- data: Array | undefined;
+ requestTreeItems: (uniques: string[]) => Promise<{
+ data: Array | undefined;
error: ProblemDetailsModel | undefined;
- asObservable?: () => Observable;
+ asObservable?: () => Observable;
}>;
- rootTreeItems: () => Promise>;
- treeItemsOf: (parentKey: string | null) => Promise>;
- treeItems: (keys: string[]) => Promise>;
+ rootTreeItems: () => Promise>;
+ treeItemsOf: (parentUnique: string | null) => Promise>;
+ treeItems: (uniques: string[]) => Promise>;
}
From 328693b0836a5a2a747ad2021b2174b051aba091 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:19:30 +0100
Subject: [PATCH 036/114] rename TreeStoreBase to EntityTreeStore
---
.../libs/extensions-registry/store.models.ts | 4 ++--
.../libs/store/tree-store-base.ts | 16 ++++++++--------
.../document-blueprint.tree.store.ts | 4 ++--
.../repository/document-type.tree.store.ts | 4 ++--
.../documents/repository/document.tree.store.ts | 10 ++++------
.../repository/media-type.tree.store.ts | 6 +++---
.../media/media/repository/media.tree.store.ts | 6 +++---
.../repository/member-group.tree.store.ts | 6 +++---
.../repository/member-type.tree.store.ts | 4 ++--
.../members/repository/member.tree.store.ts | 6 +++---
.../repository/data-type.tree.store.ts | 8 +++-----
.../repository/relation-type.tree.store.ts | 4 ++--
.../templates/repository/template.tree.store.ts | 8 +++-----
.../repository/dictionary.tree.store.ts | 6 +++---
14 files changed, 43 insertions(+), 49 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts
index abeb6b9fda..496251134f 100644
--- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts
+++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts
@@ -1,10 +1,10 @@
import type { ManifestClass } from './models';
-import { UmbStoreBase, UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbStoreBase, UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
export interface ManifestStore extends ManifestClass {
type: 'store';
}
-export interface ManifestTreeStore extends ManifestClass {
+export interface ManifestTreeStore extends ManifestClass {
type: 'treeStore';
}
diff --git a/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts b/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts
index 8a7647d015..303c13718f 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts
@@ -4,12 +4,12 @@ import { UmbStoreBase } from '@umbraco-cms/backoffice/store';
/**
* @export
- * @class UmbTreeStoreBase
+ * @class UmbEntityTreeStore
* @extends {UmbStoreBase}
* @description - General Tree Data Store
*/
// TODO: consider if tree store could be turned into a general EntityTreeStore class?
-export class UmbTreeStoreBase<
+export class UmbEntityTreeStore<
T extends EntityTreeItemResponseModel = EntityTreeItemResponseModel
> extends UmbStoreBase {
#data = new ArrayState([], (x) => x.key);
@@ -17,7 +17,7 @@ export class UmbTreeStoreBase<
/**
* Appends items to the store
* @param {Array} items
- * @memberof UmbTreeStoreBase
+ * @memberof UmbEntityTreeStore
*/
appendItems(items: Array) {
this.#data.append(items);
@@ -27,7 +27,7 @@ export class UmbTreeStoreBase<
* Updates an item in the store
* @param {string} key
* @param {Partial} data
- * @memberof UmbTreeStoreBase
+ * @memberof UmbEntityTreeStore
*/
updateItem(key: string, data: Partial) {
this.#data.next(partialUpdateFrozenArray(this.#data.getValue(), data, (entry) => entry.key === key));
@@ -36,7 +36,7 @@ export class UmbTreeStoreBase<
/**
* Removes an item from the store
* @param {string} key
- * @memberof UmbTreeStoreBase
+ * @memberof UmbEntityTreeStore
*/
removeItem(key: string) {
this.#data.removeOne(key);
@@ -44,7 +44,7 @@ export class UmbTreeStoreBase<
/**
* An observable to observe the root items
- * @memberof UmbTreeStoreBase
+ * @memberof UmbEntityTreeStore
*/
rootItems = this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === null));
@@ -52,7 +52,7 @@ export class UmbTreeStoreBase<
* Returns an observable to observe the children of a given parent
* @param {(string | null)} parentKey
* @return {*}
- * @memberof UmbTreeStoreBase
+ * @memberof UmbEntityTreeStore
*/
childrenOf(parentKey: string | null) {
return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === parentKey));
@@ -62,7 +62,7 @@ export class UmbTreeStoreBase<
* Returns an observable to observe the items with the given keys
* @param {Array} keys
* @return {*}
- * @memberof UmbTreeStoreBase
+ * @memberof UmbEntityTreeStore
*/
items(keys: Array) {
return this.#data.getObservablePart((items) => items.filter((item) => keys.includes(item.key ?? '')));
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 fb1968d7a2..cbb0c01bbb 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,5 +1,5 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
@@ -12,7 +12,7 @@ export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN = new UmbContextTok
* @extends {UmbStoreBase}
* @description - Tree Data Store for Document Blueprints
*/
-export class UmbDocumentBlueprintTreeStore extends UmbTreeStoreBase {
+export class UmbDocumentBlueprintTreeStore extends UmbEntityTreeStore {
constructor(host: UmbControllerHostInterface) {
super(host, UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN.toString());
}
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 7cfdee24df..4052a3ff76 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
@@ -1,5 +1,5 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
/**
@@ -9,7 +9,7 @@ import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
* @description - Tree Data Store for Document-Types
*/
// TODO: consider if tree store could be turned into a general EntityTreeStore class?
-export class UmbDocumentTypeTreeStore extends UmbTreeStoreBase {
+export class UmbDocumentTypeTreeStore extends UmbEntityTreeStore {
/**
* Creates an instance of UmbDocumentTypeTreeStore.
* @param {UmbControllerHostInterface} host
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 4b3bbaa7f8..4cab5a9ac3 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
@@ -1,14 +1,14 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
/**
* @export
* @class UmbDocumentTreeStore
- * @extends {UmbTreeStoreBase}
+ * @extends {UmbEntityTreeStore}
* @description - Tree Data Store for Templates
*/
-export class UmbDocumentTreeStore extends UmbTreeStoreBase {
+export class UmbDocumentTreeStore extends UmbEntityTreeStore {
/**
* Creates an instance of UmbDocumentTreeStore.
* @param {UmbControllerHostInterface} host
@@ -19,6 +19,4 @@ export class UmbDocumentTreeStore extends UmbTreeStoreBase {
}
}
-export const UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- 'UmbDocumentTreeStore'
-);
+export const UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDocumentTreeStore');
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 6e6f69ed7d..3392acb8d1 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
@@ -1,14 +1,14 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
/**
* @export
* @class UmbMediaTypeTreeStore
- * @extends {UmbTreeStoreBase}
+ * @extends {UmbEntityTreeStore}
* @description - Tree Data Store for Media Types
*/
-export class UmbMediaTypeTreeStore extends UmbTreeStoreBase {
+export class UmbMediaTypeTreeStore extends UmbEntityTreeStore {
/**
* Creates an instance of UmbMediaTypeTreeStore.
* @param {UmbControllerHostInterface} host
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 88903b1cb1..4214a9d7f2 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,7 +1,7 @@
import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
import { ArrayState } from '@umbraco-cms/backoffice/observable-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
export const UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMediaTreeStore');
@@ -9,10 +9,10 @@ export const UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken([], (x) => x.key);
/**
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 1a67085088..6e20bb0447 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,14 +1,14 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
/**
* @export
* @class UmbMemberGroupTreeStore
- * @extends {UmbTreeStoreBase}
+ * @extends {UmbEntityTreeStore}
* @description - Tree Data Store for Member Groups
*/
-export class UmbMemberGroupTreeStore extends UmbTreeStoreBase {
+export class UmbMemberGroupTreeStore extends UmbEntityTreeStore {
/**
* Creates an instance of UmbMemberGroupTreeStore.
* @param {UmbControllerHostInterface} host
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 f008de15aa..8fb32d6bea 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
@@ -1,5 +1,5 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
/**
@@ -8,7 +8,7 @@ import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/control
* @extends {UmbStoreBase}
* @description - Tree Data Store for Member Types
*/
-export class UmbMemberTypeTreeStore extends UmbTreeStoreBase {
+export class UmbMemberTypeTreeStore extends UmbEntityTreeStore {
constructor(host: UmbControllerHostInterface) {
super(host, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN.toString());
}
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 b315e84c5a..a5c832358e 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,5 +1,5 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
export const UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberTreeStore');
@@ -7,10 +7,10 @@ export const UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- 'UmbDataTypeTreeStore'
-);
+export const UMB_DATA_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDataTypeTreeStore');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.tree.store.ts
index 0220ccaa87..b66af29604 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.tree.store.ts
@@ -1,6 +1,6 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
/**
* @export
@@ -9,7 +9,7 @@ import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
* @description - Tree Data Store for relation-types
*/
// TODO: consider if tree store could be turned into a general EntityTreeStore class?
-export class UmbRelationTypeTreeStore extends UmbTreeStoreBase {
+export class UmbRelationTypeTreeStore extends UmbEntityTreeStore {
/**
* Creates an instance of UmbRelationTypeTreeStore.
* @param {UmbControllerHostInterface} host
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.tree.store.ts
index ecbe8c9031..b606566c98 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.tree.store.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.tree.store.ts
@@ -1,10 +1,8 @@
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbTreeStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
-export const UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken(
- 'UmbTemplateTreeStore'
-);
+export const UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbTemplateTreeStore');
/**
* @export
@@ -12,7 +10,7 @@ export const UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken
Date: Fri, 24 Mar 2023 10:23:03 +0100
Subject: [PATCH 037/114] align file name with new class name
---
.../libs/store/{tree-store-base.ts => entity-tree-store.ts} | 0
src/Umbraco.Web.UI.Client/libs/store/index.ts | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
rename src/Umbraco.Web.UI.Client/libs/store/{tree-store-base.ts => entity-tree-store.ts} (100%)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts b/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts
similarity index 100%
rename from src/Umbraco.Web.UI.Client/libs/store/tree-store-base.ts
rename to src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts
diff --git a/src/Umbraco.Web.UI.Client/libs/store/index.ts b/src/Umbraco.Web.UI.Client/libs/store/index.ts
index 865fdf2b5a..54a2a8d327 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/index.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/index.ts
@@ -1,3 +1,3 @@
export * from './store';
export * from './store-base';
-export * from './tree-store-base';
+export * from './entity-tree-store';
From baebfb55defb7f254b9e263a62d39e2b64d1082d Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:44:04 +0100
Subject: [PATCH 038/114] remove current tree store interface
---
src/Umbraco.Web.UI.Client/libs/store/store.ts | 29 -------------------
.../shared/collection/collection.context.ts | 12 +++-----
.../dashboard-collection.element.ts | 2 +-
.../workspace-view-collection.element.ts | 2 +-
4 files changed, 6 insertions(+), 39 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/store.ts b/src/Umbraco.Web.UI.Client/libs/store/store.ts
index 083cc9fc2f..d4af9c2275 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/store.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/store.ts
@@ -9,33 +9,7 @@ export interface UmbDataStore {
readonly storeAlias: string;
}
-export interface UmbTreeStore extends UmbDataStore {
-
- getTreeRoot(): Observable>;
-
- getTreeItemChildren(key: string): Observable>;
-
- // Notice: this might not be right to put here as only some content items has ability to be trashed.
- /**
- * @description - Trash data.
- * @param {string[]} keys
- * @return {*} {(Promise)}
- * @memberof UmbTreeStore
- */
- trash(keys: string[]): Promise;
-
- // Notice: this might not be right to put here as only some content items has ability to be moved.
- /**
- * @description - Move data.
- * @param {string[]} keys
- * @return {*} {(Promise)}
- * @memberof UmbTreeStore
- */
- move(keys: string[], destination: string): Promise;
-}
-
export interface UmbEntityDetailStore extends UmbDataStore {
-
/**
* @description - Request scaffold data by entityType and . The data is added to the store and is returned as an Observable.
* @param {string} key
@@ -61,10 +35,7 @@ export interface UmbEntityDetailStore extends UmbDataStore {
save(data: T[]): Promise;
}
-
export interface UmbContentStore extends UmbEntityDetailStore {
-
// TODO: make something that is specific for UmbContentStore, or then we should get rid of it. But for now i kept it as we might want this for rollback or other things specific to Content types.
save(data: T[]): Promise;
-
}
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 4347266039..d698ed1f71 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
@@ -1,6 +1,5 @@
import { Observable } from 'rxjs';
import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
-import type { UmbTreeStore } from '@umbraco-cms/backoffice/store';
import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
import { UmbContextToken, UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api';
import { ArrayState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
@@ -9,17 +8,14 @@ import { createExtensionClass } from 'libs/extensions-api/create-extension-class
import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository';
// TODO: Clean up the need for store as Media has switched to use Repositories(repository).
-export class UmbCollectionContext<
- DataType extends EntityTreeItemResponseModel = EntityTreeItemResponseModel,
- StoreType extends UmbTreeStore = UmbTreeStore
-> {
+export class UmbCollectionContext {
private _host: UmbControllerHostInterface;
private _entityType: string | null;
private _entityKey: string | null;
#repository?: UmbTreeRepository;
- private _store?: StoreType;
+ private _store?: any;
protected _dataObserver?: UmbObserverController;
#data = new ArrayState(>[]);
@@ -46,7 +42,7 @@ export class UmbCollectionContext<
this._entityKey = entityKey;
if (storeAlias) {
- new UmbContextConsumerController(this._host, storeAlias, (_instance: StoreType) => {
+ new UmbContextConsumerController(this._host, storeAlias, (_instance) => {
this._store = _instance;
if (!this._store) {
// TODO: if we keep the type assumption of _store existing, then we should here make sure to break the application in a good way.
@@ -175,4 +171,4 @@ export class UmbCollectionContext<
}
}
-export const UMB_COLLECTION_CONTEXT_TOKEN = new UmbContextToken>('UmbCollectionContext');
+export const UMB_COLLECTION_CONTEXT_TOKEN = new UmbContextToken>('UmbCollectionContext');
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.element.ts
index 5c21bbee38..2c96968191 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.element.ts
@@ -25,7 +25,7 @@ export class UmbDashboardCollectionElement extends UmbLitElement {
];
// TODO: Use the right type here:
- private _collectionContext?: UmbCollectionContext;
+ private _collectionContext?: UmbCollectionContext;
public manifest!: ManifestDashboardCollection;
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts
index a5a5be1fec..b6c42e1de1 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts
@@ -30,7 +30,7 @@ export class UmbWorkspaceViewCollectionElement extends UmbLitElement {
private _workspaceContext?: UmbEntityWorkspaceContextInterface;
// TODO: add type for the collection context.
- private _collectionContext?: UmbCollectionContext;
+ private _collectionContext?: UmbCollectionContext;
constructor() {
super();
From eaa27d8257f5fcce445a4542b7ad6eac526cbcd7 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:44:19 +0100
Subject: [PATCH 039/114] add new tree store interface
---
.../libs/store/tree-store.interface.ts | 11 +++++++++++
1 file changed, 11 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
diff --git a/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts b/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
new file mode 100644
index 0000000000..3dcf6529c5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
@@ -0,0 +1,11 @@
+import type { Observable } from 'rxjs';
+
+export interface UmbTreeStore {
+ appendItems: (items: Array) => void;
+ updateItem: (unique: string, item: Partial) => void;
+ removeItem: (unique: string) => void;
+
+ rootItems: () => Observable>;
+ childrenOf: (parentUnique: string | null) => Observable>;
+ treeItems: (uniques: Array) => Observable>;
+}
From 72221bf8986e37355c18413af020008e2a95da16 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:44:50 +0100
Subject: [PATCH 040/114] export tree store interface from module
---
src/Umbraco.Web.UI.Client/libs/store/index.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/index.ts b/src/Umbraco.Web.UI.Client/libs/store/index.ts
index 54a2a8d327..cdb08c0d7c 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/index.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/index.ts
@@ -1,3 +1,4 @@
export * from './store';
export * from './store-base';
export * from './entity-tree-store';
+export * from './tree-store.interface';
From c008d71bb3bfd54611d2c53369fd41c6a2d99e50 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:46:31 +0100
Subject: [PATCH 041/114] use tree store interface in manifest
---
.../libs/extensions-registry/store.models.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts
index 496251134f..18e8c10c17 100644
--- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts
+++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts
@@ -1,10 +1,10 @@
import type { ManifestClass } from './models';
-import { UmbStoreBase, UmbEntityTreeStore } from '@umbraco-cms/backoffice/store';
+import { UmbStoreBase, UmbTreeStore } from '@umbraco-cms/backoffice/store';
export interface ManifestStore extends ManifestClass {
type: 'store';
}
-export interface ManifestTreeStore extends ManifestClass {
+export interface ManifestTreeStore extends ManifestClass {
type: 'treeStore';
}
From 1ab817ab94cad3d94eb37524858284d781eb506a Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:47:11 +0100
Subject: [PATCH 042/114] require tree items to extend
TreeItemPresentationModel
---
src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts b/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
index 3dcf6529c5..aaee70915e 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
@@ -1,6 +1,7 @@
import type { Observable } from 'rxjs';
+import { TreeItemPresentationModel } from '../backend-api';
-export interface UmbTreeStore {
+export interface UmbTreeStore {
appendItems: (items: Array) => void;
updateItem: (unique: string, item: Partial) => void;
removeItem: (unique: string) => void;
From 749af924c2c19519fb0feaaf2d486c234b96cc2e Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:50:00 +0100
Subject: [PATCH 043/114] root items doesn't have to be a method
---
src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts b/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
index aaee70915e..a219fe0bf6 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
@@ -6,7 +6,7 @@ export interface UmbTreeStore) => void;
removeItem: (unique: string) => void;
- rootItems: () => Observable>;
+ rootItems: Observable>;
childrenOf: (parentUnique: string | null) => Observable>;
treeItems: (uniques: Array) => Observable>;
}
From b5f4e9c98acf5594f66a79de623a23d3b4dc1d75 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:50:47 +0100
Subject: [PATCH 044/114] rename tree items to items
---
src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts b/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
index a219fe0bf6..fab7dacd17 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/tree-store.interface.ts
@@ -8,5 +8,5 @@ export interface UmbTreeStore>;
childrenOf: (parentUnique: string | null) => Observable>;
- treeItems: (uniques: Array) => Observable>;
+ items: (uniques: Array) => Observable>;
}
From 88be27b387904936db5b3e92ae517c0c9ad3e561 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:51:22 +0100
Subject: [PATCH 045/114] add interface to entity tree store
---
.../libs/store/entity-tree-store.ts | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts b/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts
index 303c13718f..6fb7ca7e3c 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts
@@ -1,6 +1,6 @@
import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { ArrayState, partialUpdateFrozenArray } from '@umbraco-cms/backoffice/observable-api';
-import { UmbStoreBase } from '@umbraco-cms/backoffice/store';
+import { UmbStoreBase, UmbTreeStore } from '@umbraco-cms/backoffice/store';
/**
* @export
@@ -9,17 +9,15 @@ import { UmbStoreBase } from '@umbraco-cms/backoffice/store';
* @description - General Tree Data Store
*/
// TODO: consider if tree store could be turned into a general EntityTreeStore class?
-export class UmbEntityTreeStore<
- T extends EntityTreeItemResponseModel = EntityTreeItemResponseModel
-> extends UmbStoreBase {
- #data = new ArrayState([], (x) => x.key);
+export class UmbEntityTreeStore extends UmbStoreBase implements UmbTreeStore {
+ #data = new ArrayState([], (x) => x.key);
/**
* Appends items to the store
* @param {Array} items
* @memberof UmbEntityTreeStore
*/
- appendItems(items: Array) {
+ appendItems(items: Array) {
this.#data.append(items);
}
@@ -29,7 +27,7 @@ export class UmbEntityTreeStore<
* @param {Partial} data
* @memberof UmbEntityTreeStore
*/
- updateItem(key: string, data: Partial) {
+ updateItem(key: string, data: Partial) {
this.#data.next(partialUpdateFrozenArray(this.#data.getValue(), data, (entry) => entry.key === key));
}
From c3c3cfcf004d6a84fe47e0b02979908d08e207dc Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 10:59:31 +0100
Subject: [PATCH 046/114] remove todo
---
src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts b/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts
index 6fb7ca7e3c..1e82f6acaa 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts
@@ -8,7 +8,6 @@ import { UmbStoreBase, UmbTreeStore } from '@umbraco-cms/backoffice/store';
* @extends {UmbStoreBase}
* @description - General Tree Data Store
*/
-// TODO: consider if tree store could be turned into a general EntityTreeStore class?
export class UmbEntityTreeStore extends UmbStoreBase implements UmbTreeStore {
#data = new ArrayState([], (x) => x.key);
From 8a675adfb228948f98ee779ccbc23ca514bc7691 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 11:09:15 +0100
Subject: [PATCH 047/114] add file system tree store class
---
.../templating/file-system-tree.store.ts | 67 +++++++++++++++++++
1 file changed, 67 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/templating/file-system-tree.store.ts
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/file-system-tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/file-system-tree.store.ts
new file mode 100644
index 0000000000..eba5aee290
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/file-system-tree.store.ts
@@ -0,0 +1,67 @@
+import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api';
+import { ArrayState, partialUpdateFrozenArray } from '@umbraco-cms/backoffice/observable-api';
+import { UmbStoreBase, UmbTreeStore } from '@umbraco-cms/backoffice/store';
+
+/**
+ * @export
+ * @class UmbFileSystemTreeStore
+ * @extends {UmbStoreBase}
+ * @description - General Tree Data Store
+ */
+export class UmbFileSystemTreeStore extends UmbStoreBase implements UmbTreeStore {
+ #data = new ArrayState([], (x) => x.path);
+
+ /**
+ * Appends items to the store
+ * @param {Array} items
+ * @memberof UmbFileSystemTreeStore
+ */
+ appendItems(items: Array) {
+ this.#data.append(items);
+ }
+
+ /**
+ * Updates an item in the store
+ * @param {string} path
+ * @param {Partial} data
+ * @memberof UmbFileSystemTreeStore
+ */
+ updateItem(path: string, data: Partial) {
+ this.#data.next(partialUpdateFrozenArray(this.#data.getValue(), data, (entry) => entry.path === path));
+ }
+
+ /**
+ * Removes an item from the store
+ * @param {string} path
+ * @memberof UmbFileSystemTreeStore
+ */
+ removeItem(path: string) {
+ this.#data.removeOne(path);
+ }
+
+ /**
+ * An observable to observe the root items
+ * @memberof UmbFileSystemTreeStore
+ */
+ rootItems = this.#data.getObservablePart((items) => items.filter((item) => item.path === item.name));
+
+ /**
+ * Returns an observable to observe the children of a given parent
+ * @param {(string | null)} parentPath
+ * @return {*}
+ * @memberof UmbFileSystemTreeStore
+ */
+ childrenOf(parentPath: string | null) {
+ return this.#data.getObservablePart((items) => items.filter((item) => item.path?.startsWith(parentPath ?? '')));
+ }
+
+ /**
+ * Returns an observable to observe the items with the given keys
+ * @param {Array} paths
+ * @return {*}
+ * @memberof UmbFileSystemTreeStore
+ */
+ items(paths: Array) {
+ return this.#data.getObservablePart((items) => items.filter((item) => paths.includes(item.path ?? '')));
+ }
+}
From a1ee08c08b706e1472ccb2faf5501052b3b5239b Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 11:10:47 +0100
Subject: [PATCH 048/114] import file system tree store from libs
---
.../templating => libs/store}/file-system-tree.store.ts | 0
src/Umbraco.Web.UI.Client/libs/store/index.ts | 1 +
2 files changed, 1 insertion(+)
rename src/Umbraco.Web.UI.Client/{src/backoffice/templating => libs/store}/file-system-tree.store.ts (100%)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/file-system-tree.store.ts b/src/Umbraco.Web.UI.Client/libs/store/file-system-tree.store.ts
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/backoffice/templating/file-system-tree.store.ts
rename to src/Umbraco.Web.UI.Client/libs/store/file-system-tree.store.ts
diff --git a/src/Umbraco.Web.UI.Client/libs/store/index.ts b/src/Umbraco.Web.UI.Client/libs/store/index.ts
index cdb08c0d7c..f9152d3ebd 100644
--- a/src/Umbraco.Web.UI.Client/libs/store/index.ts
+++ b/src/Umbraco.Web.UI.Client/libs/store/index.ts
@@ -1,4 +1,5 @@
export * from './store';
export * from './store-base';
export * from './entity-tree-store';
+export * from './file-system-tree.store';
export * from './tree-store.interface';
From 4ee545ef904b0b6d4ee307f185e06dff0cddf1ff Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 11:25:25 +0100
Subject: [PATCH 049/114] use TreeItem presentation model en tree item element
---
.../shared/components/tree/tree-item/tree-item.element.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item/tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item/tree-item.element.ts
index 462921d54d..d91f31c020 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item/tree-item.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item/tree-item.element.ts
@@ -2,7 +2,7 @@ import { css, html } from 'lit';
import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
import { customElement, property } from 'lit/decorators.js';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
-import { EntityTreeItemResponseModel } from 'libs/backend-api/src';
+import { TreeItemPresentationModel } from 'libs/backend-api/src';
import { ManifestTreeItem } from 'libs/extensions-registry/tree-item.models';
@customElement('umb-tree-item')
@@ -10,7 +10,7 @@ export class UmbTreeItemElement extends UmbLitElement {
static styles = [UUITextStyles, css``];
@property({ type: Object, attribute: false })
- item?: EntityTreeItemResponseModel;
+ item?: TreeItemPresentationModel;
render() {
return html`
Date: Fri, 24 Mar 2023 11:25:46 +0100
Subject: [PATCH 050/114] use TreeItemPresentationModel in tree item base
element
---
.../tree/tree-item-base/tree-item-base.element.ts | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts
index 0bba8e6432..c74b4d9b8a 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts
@@ -5,13 +5,13 @@ import { ifDefined } from 'lit/directives/if-defined.js';
import { repeat } from 'lit/directives/repeat.js';
import { UmbTreeItemContextBase, UMB_TREE_ITEM_CONTEXT_TOKEN } from './tree-item-base.context';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
-import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
+import { TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api';
@customElement('umb-tree-item-base')
export class UmbTreeItemBaseElement extends UmbLitElement {
static styles = [UUITextStyles, css``];
- private _item?: EntityTreeItemResponseModel;
+ private _item?: TreeItemPresentationModel;
@property({ type: Object, attribute: false })
get item() {
return this._item;
@@ -23,7 +23,7 @@ export class UmbTreeItemBaseElement extends UmbLitElement {
}
@state()
- private _childItems?: EntityTreeItemResponseModel[];
+ private _childItems?: TreeItemPresentationModel[];
@state()
private _href?: string;
@@ -158,7 +158,8 @@ export class UmbTreeItemBaseElement extends UmbLitElement {
${this._childItems
? repeat(
this._childItems,
- (item) => item.key,
+ // TODO: get unique here instead of name. we might be able to get it from the context
+ (item) => item.name,
(item) => html``
)
: ''}
From 8b982f97cbeda974022fa17184351598c108f687 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Fri, 24 Mar 2023 11:26:04 +0100
Subject: [PATCH 051/114] add file system tree item
---
.../file-system-tree-item.context.ts | 10 +++++
.../file-system-tree-item.element.ts | 41 +++++++++++++++++++
2 files changed, 51 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/file-system-tree-item/file-system-tree-item.context.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/file-system-tree-item/file-system-tree-item.element.ts
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/file-system-tree-item/file-system-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/file-system-tree-item/file-system-tree-item.context.ts
new file mode 100644
index 0000000000..2426614064
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/file-system-tree-item/file-system-tree-item.context.ts
@@ -0,0 +1,10 @@
+import { UmbTreeItemContextBase } from '../tree-item-base/tree-item-base.context';
+import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller';
+import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api';
+
+// TODO get unique method from an entity repository static method
+export class UmbFileSystemTreeItemContext extends UmbTreeItemContextBase