From d2085f3a774ce097f1c48eac79ebf25a0865acd3 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 9 Nov 2023 14:27:00 +0100 Subject: [PATCH 01/41] delete and create actions --- .../common/delete/delete.action.ts | 2 +- .../entity-actions/create/create.action.ts | 43 +------------------ .../repository/dictionary.repository.ts | 13 ++++++ .../workspace/dictionary-workspace.context.ts | 5 +-- .../workspace/dictionary-workspace.element.ts | 10 ++++- 5 files changed, 27 insertions(+), 46 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts index 9f6d111f40..2fe29b097d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts @@ -9,7 +9,7 @@ import { import { UmbDetailRepository, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; export class UmbDeleteEntityAction< - T extends UmbDetailRepository & UmbItemRepository + T extends UmbDetailRepository & UmbItemRepository, > extends UmbEntityActionBase { #modalManager?: UmbModalManagerContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/entity-actions/create/create.action.ts index 981171b665..7eed91c078 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/entity-actions/create/create.action.ts @@ -1,55 +1,16 @@ import { UmbDictionaryRepository } from '../../repository/dictionary.repository.js'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; -import { UmbSectionSidebarContext, UMB_SECTION_SIDEBAR_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/section'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { - UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_CREATE_DICTIONARY_MODAL, -} from '@umbraco-cms/backoffice/modal'; export default class UmbCreateDictionaryEntityAction extends UmbEntityActionBase { static styles = [UmbTextStyles]; - #modalContext?: UmbModalManagerContext; - - #sectionSidebarContext!: UmbSectionSidebarContext; - constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - - new UmbContextConsumerController(this.host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { - this.#modalContext = instance; - }); - - new UmbContextConsumerController(this.host, UMB_SECTION_SIDEBAR_CONTEXT_TOKEN, (instance) => { - this.#sectionSidebarContext = instance; - }); } async execute() { - // TODO: what to do if modal service is not available? - if (!this.#modalContext) return; - if (!this.repository) return; - - // TODO: how can we get the current entity detail in the modal? Passing the observable - // feels a bit hacky. Works, but hacky. - const modalContext = this.#modalContext?.open(UMB_CREATE_DICTIONARY_MODAL, { - parentId: this.unique, - parentName: this.#sectionSidebarContext.headline, - }); - - const { name, parentId } = await modalContext.onSubmit(); - if (!name || parentId === undefined) return; - - const { data: url } = await this.repository.create({ name, parentId }); - if (!url) return; - - //TODO: Why do we need to extract the id like this? - const id = url.substring(url.lastIndexOf('/') + 1); - - history.pushState({}, '', `/section/dictionary/workspace/dictionary-item/edit/${id}`); + history.pushState({}, '', `/section/dictionary/workspace/dictionary-item/create/${this.unique ?? 'null'}`); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts index 892ef11790..cde5cfd399 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts @@ -110,6 +110,19 @@ export class UmbDictionaryRepository return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } + async requestItems(ids: Array) { + if (!ids) throw new Error('Dictionary Ids are missing'); + await this.#init; + + const { data, error } = await this.#treeSource.getItems(ids); + + if (data) { + this.#treeStore?.appendItems(data); + } + + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; + } + async rootTreeItems() { await this.#init; return this.#treeStore!.rootItems; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts index 6e762a44fe..a343cb0aeb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts @@ -68,9 +68,8 @@ export class UmbDictionaryWorkspaceContext const { data } = await this.repository.createScaffold(parentId); if (!data) return; this.setIsNew(true); - // TODO: This is a hack to get around the fact that the data is not typed correctly. - // Create and response models are different. We need to look into this. - this.#data.next(data as unknown as DictionaryItemResponseModel); + + this.#data.next(data as DictionaryItemResponseModel); } async save() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.element.ts index 99b9099679..20bdb7706a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.element.ts @@ -4,6 +4,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-dictionary-workspace') export class UmbWorkspaceDictionaryElement extends UmbLitElement { @@ -23,9 +24,16 @@ export class UmbWorkspaceDictionaryElement extends UmbLitElement { { path: 'create/:parentId', component: () => this.#element, - setup: (_component, info) => { + setup: async (_component, info) => { const parentId = info.match.params.parentId === 'null' ? null : info.match.params.parentId; this.#workspaceContext.create(parentId); + await this.#workspaceContext.create(parentId); + + new UmbWorkspaceIsNewRedirectController( + this, + this.#workspaceContext, + this.shadowRoot!.querySelector('umb-router-slot')!, + ); }, }, ]; From 9d5db918b6e4dc6830e9e39eeac389d0590e06a2 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:12:25 +0100 Subject: [PATCH 02/41] stylesheet rules refresh on new --- .../stylesheets/workspace/stylesheet-workspace.element.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts index 76485ab439..c4f74d092e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts @@ -19,6 +19,7 @@ export class UmbStylesheetWorkspaceElement extends UmbLitElement { const path = info.match.params.path === 'null' ? null : info.match.params.path; const serverPath = path === null ? null : serverFilePathFromUrlFriendlyPath(path); await this.#workspaceContext.create(serverPath); + await this.#workspaceContext.setRules([]); new UmbWorkspaceIsNewRedirectController( this, From 69a9ae9bb271c4ae03446a13c7bd3c93d631667c Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:54:53 +0100 Subject: [PATCH 03/41] stylesheet mock fix --- .../src/mocks/data/stylesheet.data.ts | 4 ++-- .../src/mocks/handlers/stylesheet.handlers.ts | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts index 26f845a4b1..197fd06b42 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts @@ -225,9 +225,10 @@ ${rule.selector} { } insertStyleSheet(item: CreateTextFileViewModelBaseModel) { + const parentPath = item.parentPath ? `${item.parentPath}/` : ''; const newItem: StylesheetDBItem = { ...item, - path: `${item.parentPath}/${item.name}.css`, + path: `${parentPath}${item.name}`, isFolder: false, hasChildren: false, type: 'stylesheet', @@ -238,7 +239,6 @@ ${rule.selector} { return newItem; } - insert(item: StylesheetDBItem) { const exits = this.data.find((i) => i.path === item.path); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts index 3ae10d1f33..dba7083fa2 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts @@ -39,8 +39,8 @@ const detailHandlers = [ const response = umbStylesheetData.getStylesheet(path); return res(ctx.status(200), ctx.json(response)); }), - rest.post(umbracoPath('/stylesheet'), (req, res, ctx) => { - const requestBody = req.json() as CreateTextFileViewModelBaseModel; + rest.post(umbracoPath('/stylesheet'), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateTextFileViewModelBaseModel; if (!requestBody) return res(ctx.status(400, 'no body found')); const response = umbStylesheetData.insertStyleSheet(requestBody); return res(ctx.status(200), ctx.json(response)); @@ -53,7 +53,7 @@ const detailHandlers = [ return res(ctx.status(200), ctx.json(response)); }), rest.put(umbracoPath('/stylesheet'), async (req, res, ctx) => { - const requestBody = await req.json() as UpdateStylesheetRequestModel; + const requestBody = (await req.json()) as UpdateStylesheetRequestModel; if (!requestBody) return res(ctx.status(400, 'no body found')); umbStylesheetData.updateData(requestBody); return res(ctx.status(200)); @@ -75,7 +75,6 @@ const detailHandlers = [ }), ]; - const rulesHandlers = [ rest.post(umbracoPath('/stylesheet/rich-text/extract-rules'), async (req, res, ctx) => { const requestBody = req.json() as ExtractRichTextStylesheetRulesRequestModel; From aeb47973a196180fdefa078879dfae09450603da Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:55:21 +0100 Subject: [PATCH 04/41] pls add more labels --- .../section-main-views.element.ts | 6 +++--- .../current-user-header-app.element.ts | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts index ee94cf6c95..d9323dd5be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts @@ -1,4 +1,4 @@ -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbRoute, UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; import { @@ -110,8 +110,8 @@ export class UmbSectionMainViewElement extends UmbLitElement { const dashboardPath = this.#constructDashboardPath(dashboard); return html` `; })} @@ -129,8 +129,8 @@ export class UmbSectionMainViewElement extends UmbLitElement { const viewPath = this.#constructViewPath(view); return html` ${viewName} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts index 527e33d922..88128bb873 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts @@ -32,9 +32,13 @@ export class UmbCurrentUserHeaderAppElement extends UmbLitElement { private async _observeCurrentUser() { if (!this._auth) return; - this.observe(this._auth.currentUser, (currentUser) => { - this._currentUser = currentUser; - }, 'umbCurrentUserObserver'); + this.observe( + this._auth.currentUser, + (currentUser) => { + this._currentUser = currentUser; + }, + 'umbCurrentUserObserver', + ); } private _handleUserClick() { @@ -43,8 +47,12 @@ export class UmbCurrentUserHeaderAppElement extends UmbLitElement { render() { return html` - - + + `; } From 43517bb7fc621374b28e0d07e98e6a32846185ff Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:58:09 +0100 Subject: [PATCH 05/41] todo --- .../dictionary/dictionary/repository/dictionary.repository.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts index 05486b2a8a..ea98f90098 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts @@ -14,7 +14,8 @@ import { import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbDictionaryRepository extends UmbBaseController +export class UmbDictionaryRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository< @@ -110,6 +111,7 @@ export class UmbDictionaryRepository extends UmbBaseController } async requestItems(ids: Array) { + // TODO: There is a bug where the item gets removed from the tree before we confirm the delete via the modal. It doesn't delete the item unless we confirm the delete. if (!ids) throw new Error('Dictionary Ids are missing'); await this.#init; From d54d557f399d60187814912784793e59dde48829 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 13 Nov 2023 12:19:23 +0100 Subject: [PATCH 06/41] fix issue with url pathing when inside folder/folder --- .../entity-actions/create/create-rtf.action.ts | 4 ++++ .../stylesheets/entity-actions/create/create.action.ts | 4 ++++ .../stylesheets/workspace/stylesheet-workspace.context.ts | 8 ++------ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts index 9bc1e2ec28..23f1dfbbc6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts @@ -7,6 +7,10 @@ export class UmbCreateRTFStylesheetAction }> e } async execute() { + if (this.unique !== null) { + this.unique = this.unique.replace(/\//g, '%2f'); + } + history.pushState( null, '', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts index b5b4e71368..b41970b683 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts @@ -7,6 +7,10 @@ export class UmbCreateStylesheetAction }> exte } async execute() { + if (this.unique !== null) { + this.unique = this.unique.replace(/\//g, '%2f'); + } + history.pushState(null, '', `section/settings/workspace/stylesheet/create/${this.unique ?? 'null'}/view/code`); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index ca05d25fe0..23aa022152 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -2,11 +2,7 @@ import { UmbStylesheetRepository } from '../repository/stylesheet.repository.js' import { StylesheetDetails } from '../index.js'; import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { - UmbArrayState, - UmbBooleanState, - UmbObjectState -} from '@umbraco-cms/backoffice/observable-api'; +import { UmbArrayState, UmbBooleanState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { RichTextRuleModel, UpdateStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -48,7 +44,7 @@ export class UmbStylesheetWorkspaceContext } getEntityId() { - const path = this.getData()?.path; + const path = this.getData()?.path?.replace(/\//g, '%2f'); const name = this.getData()?.name; // TODO: %2F is a slash (/). Should we make it an actual slash in the URL? (%2F for now so that the server can find the correct stylesheet via URL) From f0003dd7f8da01699586109d6724e0d3e9b56a07 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 13 Nov 2023 12:20:27 +0100 Subject: [PATCH 07/41] remove todo --- .../stylesheets/entity-actions/create/create-rtf.action.ts | 1 + .../stylesheets/entity-actions/create/create.action.ts | 1 + .../stylesheets/workspace/stylesheet-workspace.context.ts | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts index 23f1dfbbc6..0488b9c129 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts @@ -8,6 +8,7 @@ export class UmbCreateRTFStylesheetAction }> e async execute() { if (this.unique !== null) { + // Note: %2f is a slash (/) this.unique = this.unique.replace(/\//g, '%2f'); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts index b41970b683..7e1a87a013 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts @@ -8,6 +8,7 @@ export class UmbCreateStylesheetAction }> exte async execute() { if (this.unique !== null) { + // Note: %2f is a slash (/) this.unique = this.unique.replace(/\//g, '%2f'); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index 23aa022152..d84322d9d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -47,8 +47,8 @@ export class UmbStylesheetWorkspaceContext const path = this.getData()?.path?.replace(/\//g, '%2f'); const name = this.getData()?.name; - // TODO: %2F is a slash (/). Should we make it an actual slash in the URL? (%2F for now so that the server can find the correct stylesheet via URL) - return path && name ? `${path}%2F${name}` : name || ''; + // Note: %2f is a slash (/) + return path && name ? `${path}%2f${name}` : name || ''; } getData() { From 915ae7675c3724acee55689c5fb479dfdda56c1e Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 13 Nov 2023 12:25:42 +0100 Subject: [PATCH 08/41] fix preview path when in create workspace --- .../workspace/stylesheet-workspace-editor.element.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts index d37300a880..2028478b43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts @@ -48,7 +48,11 @@ export class UmbStylesheetWorkspaceEditorElement extends UmbLitElement { this.#workspaceContext.path, (path) => { this._path = path; - this._dirName = this._path?.substring(0, this._path?.lastIndexOf('\\') + 1)?.replace(/\\/g, '/'); + if (this._path?.includes('.css')) { + this._dirName = this._path?.substring(0, this._path?.lastIndexOf('\\') + 1)?.replace(/\\/g, '/'); + } else { + this._dirName = path + '/'; + } }, '_observeStylesheetPath', ); From 7347feece9d2a7cc6dc73dd43cbc17f4c2eee06e Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 13 Nov 2023 13:07:51 +0100 Subject: [PATCH 09/41] letter change to capital --- .../stylesheets/entity-actions/create/create-rtf.action.ts | 4 ++-- .../stylesheets/entity-actions/create/create.action.ts | 4 ++-- .../stylesheets/workspace/stylesheet-workspace.context.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts index 0488b9c129..de93d19cc1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create-rtf.action.ts @@ -8,8 +8,8 @@ export class UmbCreateRTFStylesheetAction }> e async execute() { if (this.unique !== null) { - // Note: %2f is a slash (/) - this.unique = this.unique.replace(/\//g, '%2f'); + // Note: %2F is a slash (/) + this.unique = this.unique.replace(/\//g, '%2F'); } history.pushState( diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts index 7e1a87a013..a8ed2d1327 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts @@ -8,8 +8,8 @@ export class UmbCreateStylesheetAction }> exte async execute() { if (this.unique !== null) { - // Note: %2f is a slash (/) - this.unique = this.unique.replace(/\//g, '%2f'); + // Note: %2F is a slash (/) + this.unique = this.unique.replace(/\//g, '%2F'); } history.pushState(null, '', `section/settings/workspace/stylesheet/create/${this.unique ?? 'null'}/view/code`); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index d84322d9d2..480c6be472 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -44,11 +44,11 @@ export class UmbStylesheetWorkspaceContext } getEntityId() { - const path = this.getData()?.path?.replace(/\//g, '%2f'); + const path = this.getData()?.path?.replace(/\//g, '%2F'); const name = this.getData()?.name; - // Note: %2f is a slash (/) - return path && name ? `${path}%2f${name}` : name || ''; + // Note: %2F is a slash (/) + return path && name ? `${path}%2F${name}` : name || ''; } getData() { From b0ca790ee98afbbd37f199adeddb393e2c4baa9d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 14:27:11 +0100 Subject: [PATCH 10/41] split tree logic into its own module --- .../packages/templating/stylesheets/config.ts | 2 - .../packages/templating/stylesheets/index.ts | 1 + .../stylesheets/repository/manifests.ts | 16 +-- .../repository/stylesheet.repository.ts | 103 +++--------------- .../templating/stylesheets/tree/index.ts | 1 + .../templating/stylesheets/tree/manifests.ts | 30 ++++- .../tree/stylesheet-tree.repository.ts | 87 +++++++++++++++ .../stylesheet.tree.server.data.ts | 4 +- .../stylesheet.tree.store.ts | 2 +- 9 files changed, 134 insertions(+), 112 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts rename src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/{repository/sources => tree}/stylesheet.tree.server.data.ts (99%) rename src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/{repository => tree}/stylesheet.tree.store.ts (96%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts index cb6e44810e..d6da6d671a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts @@ -6,8 +6,6 @@ export const STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE = 'stylesheet-folder-empty'; export const STYLESHEET_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet'; -export const STYLESHEET_TREE_ALIAS = 'Umb.Tree.Stylesheet'; - export const UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Stylesheet.Tree'; export const UMB_STYLESHEET_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Stylesheet'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts index ec91672f86..c0657c8bf8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts @@ -3,3 +3,4 @@ import { StylesheetResponseModel } from '@umbraco-cms/backoffice/backend-api'; export type StylesheetDetails = StylesheetResponseModel; export * from './repository/index.js'; +export { UmbStylesheetTreeRepository } from './tree/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts index e1ace39c01..97f5b9c49f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts @@ -1,8 +1,6 @@ -import { STYLESHEET_REPOSITORY_ALIAS, STYLESHEET_TREE_STORE_ALIAS } from '../config.js'; +import { STYLESHEET_REPOSITORY_ALIAS } from '../config.js'; import { UmbStylesheetRepository } from './stylesheet.repository.js'; -import { UmbStylesheetTreeStore } from './stylesheet.tree.store.js'; -import { ManifestRepository, ManifestTreeStore } from '@umbraco-cms/backoffice/extension-registry'; - +import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; const repository: ManifestRepository = { type: 'repository', @@ -11,12 +9,4 @@ const repository: ManifestRepository = { api: UmbStylesheetRepository, }; - -const treeStore: ManifestTreeStore = { - type: 'treeStore', - alias: STYLESHEET_TREE_STORE_ALIAS, - name: 'Stylesheet Tree Store', - api: UmbStylesheetTreeStore, -}; - -export const manifests = [treeStore, repository]; +export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts index a0c62959b3..4efca8c0ef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts @@ -1,6 +1,4 @@ import { StylesheetDetails } from '../index.js'; -import { UmbStylesheetTreeStore, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN } from './stylesheet.tree.store.js'; -import { UmbStylesheetTreeServerDataSource } from './sources/stylesheet.tree.server.data.js'; import { UmbStylesheetServerDataSource } from './sources/stylesheet.server.data.js'; import { StylesheetGetFolderResponse, @@ -13,7 +11,6 @@ import { UmbDataSourceErrorResponse, UmbDetailRepository, UmbFolderRepository, - UmbTreeRepository, } from '@umbraco-cms/backoffice/repository'; import { CreateFolderRequestModel, @@ -21,7 +18,6 @@ import { CreateTextFileViewModelBaseModel, ExtractRichTextStylesheetRulesRequestModel, ExtractRichTextStylesheetRulesResponseModel, - FileSystemTreeItemPresentationModel, FolderModelBaseModel, FolderResponseModel, InterpolateRichTextStylesheetRequestModel, @@ -33,33 +29,24 @@ import { UpdateStylesheetRequestModel, UpdateTextFileViewModelBaseModel, } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/tree'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbStylesheetRepository extends UmbBaseController +export class UmbStylesheetRepository + extends UmbBaseController implements - UmbTreeRepository, UmbDetailRepository, UmbFolderRepository, UmbApi { #dataSource; - #treeDataSource; - #treeStore?: UmbStylesheetTreeStore; #folderDataSource; - #init; constructor(host: UmbControllerHostElement) { super(host); // TODO: figure out how spin up get the correct data source this.#dataSource = new UmbStylesheetServerDataSource(this); - this.#treeDataSource = new UmbStylesheetTreeServerDataSource(this); this.#folderDataSource = new UmbStylesheetFolderServerDataSource(this); - - this.#init = this.consumeContext(UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, (instance) => { - this.#treeStore = instance; - }).asPromise(); } //#region FOLDER: @@ -77,34 +64,34 @@ export class UmbStylesheetRepository extends UmbBaseController async createFolder( folderRequest: CreateFolderRequestModel, ): Promise<{ data?: string | undefined; error?: ProblemDetails | undefined }> { - await this.#init; const req = { parentPath: folderRequest.parentId, name: folderRequest.name, }; const promise = this.#folderDataSource.insert(req); await promise; - this.requestTreeItemsOf(folderRequest.parentId ? folderRequest.parentId : null); + //this.requestTreeItemsOf(folderRequest.parentId ? folderRequest.parentId : null); return promise; } + async requestFolder( unique: string, ): Promise<{ data?: StylesheetGetFolderResponse | undefined; error?: ProblemDetails | undefined }> { - await this.#init; return this.#folderDataSource.get(unique); } + updateFolder( unique: string, folder: FolderModelBaseModel, ): Promise<{ data?: FolderModelBaseModel | undefined; error?: ProblemDetails | undefined }> { throw new Error('Method not implemented.'); } + async deleteFolder(path: string): Promise<{ error?: ProblemDetails | undefined }> { - await this.#init; const { data } = await this.requestFolder(path); const promise = this.#folderDataSource.delete(path); await promise; - this.requestTreeItemsOf(data?.parentPath ? data?.parentPath : null); + //this.requestTreeItemsOf(data?.parentPath ? data?.parentPath : null); return promise; } @@ -121,26 +108,29 @@ export class UmbStylesheetRepository extends UmbBaseController async requestById(id: string): Promise> { if (!id) throw new Error('id is missing'); - await this.#init; const { data, error } = await this.#dataSource.get(id); return { data, error }; } + byId(id: string): Promise> { throw new Error('Method not implemented.'); } + async create(data: CreateTextFileViewModelBaseModel): Promise> { const promise = this.#dataSource.insert(data); await promise; - this.requestTreeItemsOf(data.parentPath ? data.parentPath : null); + //this.requestTreeItemsOf(data.parentPath ? data.parentPath : null); return promise; } + save(id: string, data: UpdateTextFileViewModelBaseModel): Promise { return this.#dataSource.update(id, data); } + delete(id: string): Promise { const promise = this.#dataSource.delete(id); const parentPath = id.substring(0, id.lastIndexOf('/')); - this.requestTreeItemsOf(parentPath ? parentPath : null); + //this.requestTreeItemsOf(parentPath ? parentPath : null); return promise; } @@ -179,71 +169,4 @@ export class UmbStylesheetRepository extends UmbBaseController } //#endregion - - //#region TREE: - async requestTreeRoot() { - await this.#init; - - const data = { - path: null, - type: 'stylesheet-root', - name: 'Stylesheets', - icon: 'icon-folder', - hasChildren: true, - }; - - return { data }; - } - - async requestRootTreeItems() { - await this.#init; - - const { data, error } = await this.#treeDataSource.getRootItems(); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - return { data, error }; - } - - async requestTreeItemsOf(path: string | null) { - if (path === undefined) throw new Error('Cannot request tree item with missing path'); - - await this.#init; - - const { data, error } = await this.#treeDataSource.getChildrenOf(path); - - if (data) { - this.#treeStore!.appendItems(data.items); - } - - return { data, error, asObservable: () => this.#treeStore!.childrenOf(path) }; - } - - async requestItems(paths: Array) { - if (!paths) throw new Error('Paths are missing'); - await this.#init; - const { data, error } = await this.#treeDataSource.getItems(paths); - return { data, error }; - } - - async rootTreeItems() { - await this.#init; - return this.#treeStore!.rootItems; - } - - async treeItemsOf(parentPath: string | null) { - if (!parentPath) throw new Error('Parent Path is missing'); - await this.#init; - return this.#treeStore!.childrenOf(parentPath); - } - - async itemsLegacy(paths: Array) { - if (!paths) throw new Error('Paths are missing'); - await this.#init; - return this.#treeStore!.items(paths); - } - - //#endregion } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/index.ts new file mode 100644 index 0000000000..de16c2e3c3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/index.ts @@ -0,0 +1 @@ +export { UmbStylesheetTreeRepository } from './stylesheet-tree.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts index 108889cea8..a229cb6d90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts @@ -1,7 +1,29 @@ -import { STYLESHEET_ENTITY_TYPE, STYLESHEET_REPOSITORY_ALIAS } from '../config.js'; -import type { ManifestTree, ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; +import { STYLESHEET_ENTITY_TYPE, STYLESHEET_TREE_STORE_ALIAS } from '../config.js'; +import { UmbStylesheetTreeRepository } from './stylesheet-tree.repository.js'; +import { UmbStylesheetTreeStore } from './stylesheet.tree.store.js'; +import type { + ManifestRepository, + ManifestTree, + ManifestTreeItem, + ManifestTreeStore, +} from '@umbraco-cms/backoffice/extension-registry'; export const STYLESHEET_TREE_ALIAS = 'Umb.Tree.Stylesheet'; +export const STYLESHEET_TREE_REPOSITORY_ALIAS = 'Umb.Repository.StylesheetTree'; + +const treeRepository: ManifestRepository = { + type: 'repository', + alias: STYLESHEET_TREE_REPOSITORY_ALIAS, + name: 'Stylesheet Tree Repository', + api: UmbStylesheetTreeRepository, +}; + +const treeStore: ManifestTreeStore = { + type: 'treeStore', + alias: STYLESHEET_TREE_STORE_ALIAS, + name: 'Stylesheet Tree Store', + api: UmbStylesheetTreeStore, +}; const tree: ManifestTree = { type: 'tree', @@ -9,7 +31,7 @@ const tree: ManifestTree = { name: 'Stylesheet Tree', weight: 10, meta: { - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, + repositoryAlias: STYLESHEET_TREE_REPOSITORY_ALIAS, }, }; @@ -23,4 +45,4 @@ const treeItem: ManifestTreeItem = { }, }; -export const manifests = [tree, treeItem]; +export const manifests = [treeRepository, treeStore, tree, treeItem]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts new file mode 100644 index 0000000000..02ce20eace --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -0,0 +1,87 @@ +import { UmbStylesheetTreeServerDataSource } from './stylesheet.tree.server.data.js'; +import { UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, UmbStylesheetTreeStore } from './stylesheet.tree.store.js'; +import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbRepositoryBase, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/tree'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbStylesheetTreeRepository + extends UmbRepositoryBase + implements UmbTreeRepository +{ + #init; + #treeDataSource; + #treeStore?: UmbStylesheetTreeStore; + + constructor(host: UmbControllerHost) { + super(host); + this.#treeDataSource = new UmbStylesheetTreeServerDataSource(this); + + this.#init = this.consumeContext(UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, (instance) => { + this.#treeStore = instance; + }).asPromise(); + } + async requestTreeRoot() { + await this.#init; + + const data = { + path: null, + type: 'stylesheet-root', + name: 'Stylesheets', + icon: 'icon-folder', + hasChildren: true, + }; + + return { data }; + } + + async requestRootTreeItems() { + await this.#init; + + const { data, error } = await this.#treeDataSource.getRootItems(); + + if (data) { + this.#treeStore?.appendItems(data.items); + } + + return { data, error }; + } + + async requestTreeItemsOf(path: string | null) { + if (path === undefined) throw new Error('Cannot request tree item with missing path'); + + await this.#init; + + const { data, error } = await this.#treeDataSource.getChildrenOf(path); + + if (data) { + this.#treeStore!.appendItems(data.items); + } + + return { data, error, asObservable: () => this.#treeStore!.childrenOf(path) }; + } + + async requestItems(paths: Array) { + if (!paths) throw new Error('Paths are missing'); + await this.#init; + const { data, error } = await this.#treeDataSource.getItems(paths); + return { data, error }; + } + + async rootTreeItems() { + await this.#init; + return this.#treeStore!.rootItems; + } + + async treeItemsOf(parentPath: string | null) { + if (!parentPath) throw new Error('Parent Path is missing'); + await this.#init; + return this.#treeStore!.childrenOf(parentPath); + } + + async itemsLegacy(paths: Array) { + if (!paths) throw new Error('Paths are missing'); + await this.#init; + return this.#treeStore!.items(paths); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet.tree.server.data.ts similarity index 99% rename from src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet.tree.server.data.ts index 7c846f3898..b69645a95b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet.tree.server.data.ts @@ -48,7 +48,7 @@ export class UmbStylesheetTreeServerDataSource implements UmbTreeDataSource( - 'UmbStylesheetTreeStore' + 'UmbStylesheetTreeStore', ); From ef6b71508f10b77691eaba6b4cf5494734b64df9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 14:31:44 +0100 Subject: [PATCH 11/41] move tree store constant into manifest file --- .../src/packages/templating/stylesheets/config.ts | 1 - .../src/packages/templating/stylesheets/tree/manifests.ts | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts index d6da6d671a..08a4412903 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts @@ -10,4 +10,3 @@ export const UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Styleshe export const UMB_STYLESHEET_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Stylesheet'; export const STYLESHEET_STORE_ALIAS = 'Umb.Store.Stylesheet'; -export const STYLESHEET_TREE_STORE_ALIAS = 'Umb.Store.StylesheetTree'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts index a229cb6d90..993702de9d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts @@ -1,4 +1,4 @@ -import { STYLESHEET_ENTITY_TYPE, STYLESHEET_TREE_STORE_ALIAS } from '../config.js'; +import { STYLESHEET_ENTITY_TYPE } from '../config.js'; import { UmbStylesheetTreeRepository } from './stylesheet-tree.repository.js'; import { UmbStylesheetTreeStore } from './stylesheet.tree.store.js'; import type { @@ -10,6 +10,7 @@ import type { export const STYLESHEET_TREE_ALIAS = 'Umb.Tree.Stylesheet'; export const STYLESHEET_TREE_REPOSITORY_ALIAS = 'Umb.Repository.StylesheetTree'; +export const STYLESHEET_TREE_STORE_ALIAS = 'Umb.Store.StylesheetTree'; const treeRepository: ManifestRepository = { type: 'repository', From 9f860f32fb212b5f405d4ce4dfda52e4afd02297 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 14:33:10 +0100 Subject: [PATCH 12/41] align file names --- .../src/packages/templating/stylesheets/tree/manifests.ts | 2 +- .../templating/stylesheets/tree/stylesheet-tree.repository.ts | 4 ++-- ...e.server.data.ts => stylesheet-tree.server.data-source.ts} | 0 .../{stylesheet.tree.store.ts => stylesheet-tree.store.ts} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/{stylesheet.tree.server.data.ts => stylesheet-tree.server.data-source.ts} (100%) rename src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/{stylesheet.tree.store.ts => stylesheet-tree.store.ts} (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts index 993702de9d..763ac0a02a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts @@ -1,6 +1,6 @@ import { STYLESHEET_ENTITY_TYPE } from '../config.js'; import { UmbStylesheetTreeRepository } from './stylesheet-tree.repository.js'; -import { UmbStylesheetTreeStore } from './stylesheet.tree.store.js'; +import { UmbStylesheetTreeStore } from './stylesheet-tree.store.js'; import type { ManifestRepository, ManifestTree, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index 02ce20eace..236a8a0de4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -1,5 +1,5 @@ -import { UmbStylesheetTreeServerDataSource } from './stylesheet.tree.server.data.js'; -import { UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, UmbStylesheetTreeStore } from './stylesheet.tree.store.js'; +import { UmbStylesheetTreeServerDataSource } from './stylesheet-tree.server.data-source.js'; +import { UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, UmbStylesheetTreeStore } from './stylesheet-tree.store.js'; import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbRepositoryBase, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/tree'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet.tree.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet.tree.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts From c21dbe15b8d058da2e8527d0d4ed36ca4b4c0ffe Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 14:36:21 +0100 Subject: [PATCH 13/41] return observable in request tree root --- .../templating/stylesheets/tree/stylesheet-tree.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index 236a8a0de4..8f68a1e0dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -44,7 +44,7 @@ export class UmbStylesheetTreeRepository this.#treeStore?.appendItems(data.items); } - return { data, error }; + return { data, error, asObservable: () => this.#treeStore!.rootItems }; } async requestTreeItemsOf(path: string | null) { From 5acdf875c404c16d13a15bd31edffd7a6f13cc12 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 13 Nov 2023 15:01:23 +0100 Subject: [PATCH 14/41] request root tree items --- .../templating/stylesheets/tree/stylesheet-tree.repository.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index 8f68a1e0dc..48729a8e06 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -36,6 +36,7 @@ export class UmbStylesheetTreeRepository } async requestRootTreeItems() { + console.log('stylesheet root'); await this.#init; const { data, error } = await this.#treeDataSource.getRootItems(); @@ -49,6 +50,9 @@ export class UmbStylesheetTreeRepository async requestTreeItemsOf(path: string | null) { if (path === undefined) throw new Error('Cannot request tree item with missing path'); + if (path === null || path === '/' || path === '') { + return this.requestRootTreeItems(); + } await this.#init; From eab6cdffd5b3cf3c1abc441db03e975bee24f455 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 15:07:13 +0100 Subject: [PATCH 15/41] add stylesheet item repository, source and store --- .../repository/tree-repository.interface.ts | 2 +- .../stylesheets/repository/item/manifests.ts | 20 ++++++++ .../item/stylesheet-item.repository.ts | 50 +++++++++++++++++++ .../item/stylesheet-item.server.data.ts | 40 +++++++++++++++ .../repository/item/stylesheet-item.store.ts | 38 ++++++++++++++ .../stylesheets/repository/manifests.ts | 3 +- .../tree/stylesheet-tree.repository.ts | 7 --- 7 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts index 46f52b5f06..0ad6c918bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts @@ -6,7 +6,7 @@ import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export interface UmbTreeRepository< TreeItemType extends EntityTreeItemResponseModel, - TreeRootType extends UmbTreeRootModel = UmbTreeRootEntityModel + TreeRootType extends UmbTreeRootModel = UmbTreeRootEntityModel, > extends UmbApi { requestTreeRoot: () => Promise<{ data?: TreeRootType; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts new file mode 100644 index 0000000000..70162ca789 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts @@ -0,0 +1,20 @@ +import { UmbStylesheetItemStore } from './stylesheet-item.store.js'; +import { UmbStylesheetItemRepository } from './stylesheet-item.repository.js'; +import type { ManifestRepository, ManifestItemStore } from '@umbraco-cms/backoffice/extension-registry'; + +export const STYLESHEET_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.StylesheetItem'; +const repository: ManifestRepository = { + type: 'repository', + alias: STYLESHEET_ITEM_REPOSITORY_ALIAS, + name: 'Stylesheet Item Repository', + api: UmbStylesheetItemRepository, +}; + +const itemStore: ManifestItemStore = { + type: 'itemStore', + alias: 'Umb.ItemStore.Stylesheet', + name: 'Stylesheet Item Store', + api: UmbStylesheetItemStore, +}; + +export const manifests = [repository, itemStore]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts new file mode 100644 index 0000000000..d0f31aa9ee --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts @@ -0,0 +1,50 @@ +import { UmbStylesheetItemServerDataSource } from './stylesheet-item.server.data.js'; +import { UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN, UmbStylesheetItemStore } from './stylesheet-item.store.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemDataSource, UmbItemRepository, UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import { StylesheetItemResponseModel, UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbStylesheetItemRepository extends UmbRepositoryBase implements UmbItemRepository { + #init; + #itemSource: UmbItemDataSource; + #itemStore?: UmbStylesheetItemStore; + + constructor(host: UmbControllerHost) { + super(host); + this.#itemSource = new UmbStylesheetItemServerDataSource(host); + + this.#init = this.consumeContext(UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN, (instance) => { + this.#itemStore = instance; + }).asPromise(); + } + + /** + * Requests the stylesheet items for the given ids + * @param {Array} ids + * @return {*} + * @memberof UmbStylesheetItemRepository + */ + async requestItems(ids: Array) { + if (!ids) throw new Error('Ids are missing'); + await this.#init; + + const { data, error } = await this.#itemSource.getItems(ids); + + if (data) { + this.#itemStore?.appendItems(data); + } + + return { data, error, asObservable: () => this.#itemStore!.items(ids) }; + } + + /** + * Returns a promise with an observable of the stylesheet items for the given ids + * @param {Array} ids + * @return {Promise>} + * @memberof UmbStylesheetItemRepository + */ + async items(ids: Array) { + await this.#init; + return this.#itemStore!.items(ids); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data.ts new file mode 100644 index 0000000000..2c65c2a56c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data.ts @@ -0,0 +1,40 @@ +import type { UmbItemDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { StylesheetItemResponseModel, StylesheetResource } from '@umbraco-cms/backoffice/backend-api'; + +/** + * A data source for stylesheet items that fetches data from the server + * @export + * @class UmbStylesheetItemServerDataSource + * @implements {UmbItemDataSource} + */ +export class UmbStylesheetItemServerDataSource implements UmbItemDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbStylesheetItemServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbStylesheetItemServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches the items for the given paths from the server + * @param {Array} paths + * @return {*} + * @memberof UmbStylesheetItemServerDataSource + */ + async getItems(paths: Array) { + if (!paths) throw new Error('Paths are missing'); + + return tryExecuteAndNotify( + this.#host, + StylesheetResource.getStylesheetItem({ + path: paths, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts new file mode 100644 index 0000000000..c80754a7a3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts @@ -0,0 +1,38 @@ +import type { StylesheetItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; + +/** + * @export + * @class UmbStylesheetItemStore + * @extends {UmbStoreBase} + * @description - Data Store for Stylesheet items + */ + +export class UmbStylesheetItemStore + extends UmbStoreBase + implements UmbItemStore +{ + /** + * Creates an instance of UmbStylesheetItemStore. + * @param {UmbControllerHostElement} host + * @memberof UmbStylesheetItemStore + */ + constructor(host: UmbControllerHostElement) { + super( + host, + UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN.toString(), + new UmbArrayState([], (x) => x.path), + ); + } + + items(ids: Array) { + return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.path ?? ''))); + } +} + +export const UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN = new UmbContextToken( + 'UmbStylesheetItemStore', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts index 97f5b9c49f..21121d4f14 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts @@ -1,5 +1,6 @@ import { STYLESHEET_REPOSITORY_ALIAS } from '../config.js'; import { UmbStylesheetRepository } from './stylesheet.repository.js'; +import { manifests as itemManifests } from './item/manifests.js'; import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; const repository: ManifestRepository = { @@ -9,4 +10,4 @@ const repository: ManifestRepository = { api: UmbStylesheetRepository, }; -export const manifests = [repository]; +export const manifests = [repository, itemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index 8f68a1e0dc..e84a6fb730 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -61,13 +61,6 @@ export class UmbStylesheetTreeRepository return { data, error, asObservable: () => this.#treeStore!.childrenOf(path) }; } - async requestItems(paths: Array) { - if (!paths) throw new Error('Paths are missing'); - await this.#init; - const { data, error } = await this.#treeDataSource.getItems(paths); - return { data, error }; - } - async rootTreeItems() { await this.#init; return this.#treeStore!.rootItems; From 9795509c0cf7101b29d16d2ea2a1bceabab3ef66 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 15:08:44 +0100 Subject: [PATCH 16/41] expand array --- .../src/packages/templating/stylesheets/repository/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts index 21121d4f14..c26ebfef2f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts @@ -10,4 +10,4 @@ const repository: ManifestRepository = { api: UmbStylesheetRepository, }; -export const manifests = [repository, itemManifests]; +export const manifests = [repository, ...itemManifests]; From 985289f2d00921850c6a69ca03d0a92d84fbbb8e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 15:11:50 +0100 Subject: [PATCH 17/41] remove legacy method --- .../stylesheets/tree/stylesheet-tree.repository.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index 4b84227639..b38b17af75 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -75,10 +75,4 @@ export class UmbStylesheetTreeRepository await this.#init; return this.#treeStore!.childrenOf(parentPath); } - - async itemsLegacy(paths: Array) { - if (!paths) throw new Error('Paths are missing'); - await this.#init; - return this.#treeStore!.items(paths); - } } From 71a506fc36b27a95d739e78030f0b91fd875b821 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 15:28:51 +0100 Subject: [PATCH 18/41] add file system item store --- .../core/store/file-system-item.store.ts | 31 +++++++++++++++++++ .../src/packages/core/store/index.ts | 1 + 2 files changed, 32 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts new file mode 100644 index 0000000000..8c4705a707 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts @@ -0,0 +1,31 @@ +import { UmbStoreBase } from './store-base.js'; +import { UmbItemStore } from './item-store.interface.js'; +import type { FileItemResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +/** + * @export + * @class UmbFileSystemItemStore + * @extends {UmbStoreBase} + * @description - Data Store for File system items + */ + +export class UmbFileSystemItemStore + extends UmbStoreBase + implements UmbItemStore +{ + constructor(host: UmbControllerHost, storeAlias: string) { + super(host, storeAlias, new UmbArrayState([], (x) => x.path)); + } + + /** + * Return an observable to observe file system items + * @param {Array} ids + * @return {*} + * @memberof UmbFileSystemItemStore + */ + items(ids: Array) { + return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.path ?? ''))); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts index 0ab513ac78..209288b682 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts @@ -5,3 +5,4 @@ export * from './store-base.js'; export * from './store.interface.js'; export * from './store.js'; export * from './tree-store.interface.js'; +export * from './file-system-item.store.js'; From 7d02b58d800424bd65c04f07700cd97a3f7ece32 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 15:29:07 +0100 Subject: [PATCH 19/41] use file system item store as base for stylesheet item store --- .../repository/item/stylesheet-item.store.ts | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts index c80754a7a3..f621751a98 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts @@ -1,35 +1,23 @@ import type { StylesheetItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbItemStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbFileSystemItemStore } from '@umbraco-cms/backoffice/store'; /** * @export * @class UmbStylesheetItemStore - * @extends {UmbStoreBase} + * @extends {UmbFileSystemItemStore} * @description - Data Store for Stylesheet items */ -export class UmbStylesheetItemStore - extends UmbStoreBase - implements UmbItemStore -{ +export class UmbStylesheetItemStore extends UmbFileSystemItemStore { /** * Creates an instance of UmbStylesheetItemStore. * @param {UmbControllerHostElement} host * @memberof UmbStylesheetItemStore */ constructor(host: UmbControllerHostElement) { - super( - host, - UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN.toString(), - new UmbArrayState([], (x) => x.path), - ); - } - - items(ids: Array) { - return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.path ?? ''))); + super(host, UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN.toString()); } } From e963944f297e33eba9778a0eea2eb18080a3ab12 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 15:30:13 +0100 Subject: [PATCH 20/41] remove hasChildren from file mock data --- src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts index 197fd06b42..f79da572c9 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts @@ -87,7 +87,7 @@ h1 { path: 'Folder 1/Stylesheet File 3.css', name: 'Stylesheet File 3.css', type: 'stylesheet', - hasChildren: true, + hasChildren: false, isFolder: false, content: `h1 { color: pink; From ea0d7fe041c56f2a69b1ce08a6055db7f382f751 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 15:45:18 +0100 Subject: [PATCH 21/41] add todos to clean up the tree repository interface --- .../repository/tree-repository.interface.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts index 0ad6c918bf..bfd79af318 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts @@ -13,17 +13,26 @@ export interface UmbTreeRepository< error?: ProblemDetails; }>; + requestTreeItemsOf: (parentUnique: string | null) => Promise<{ + data?: UmbPagedData; + error?: ProblemDetails; + asObservable?: () => Observable; + }>; + + treeItemsOf: (parentUnique: string | null) => Promise>; + + /* TODO: remove this. It is not used client side. + Logic to call the root endpoint should be in the data source + because it is a server decision to split them + */ requestRootTreeItems: () => Promise<{ data?: UmbPagedData; error?: ProblemDetails; asObservable?: () => Observable; }>; - requestTreeItemsOf: (parentUnique: string | null) => Promise<{ - data?: UmbPagedData; - error?: ProblemDetails; - asObservable?: () => Observable; - }>; + // TODO: remove + rootTreeItems: () => Promise>; // TODO: remove this when all repositories are migrated to the new interface items interface requestItemsLegacy?: (uniques: string[]) => Promise<{ @@ -32,10 +41,6 @@ export interface UmbTreeRepository< asObservable?: () => Observable; }>; - rootTreeItems: () => Promise>; - - treeItemsOf: (parentUnique: string | null) => Promise>; - // TODO: remove this when all repositories are migrated to the new items interface itemsLegacy?: (uniques: string[]) => Promise>; } From 24831d07f9893ab27c919255b93d823357135fd1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 15:49:55 +0100 Subject: [PATCH 22/41] remove unused --- .../tree/stylesheet-tree.repository.ts | 22 ------------------- .../stylesheet-tree.server.data-source.ts | 13 +---------- 2 files changed, 1 insertion(+), 34 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index b38b17af75..ba84eeedc0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -35,25 +35,8 @@ export class UmbStylesheetTreeRepository return { data }; } - async requestRootTreeItems() { - console.log('stylesheet root'); - await this.#init; - - const { data, error } = await this.#treeDataSource.getRootItems(); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - return { data, error, asObservable: () => this.#treeStore!.rootItems }; - } - async requestTreeItemsOf(path: string | null) { if (path === undefined) throw new Error('Cannot request tree item with missing path'); - if (path === null || path === '/' || path === '') { - return this.requestRootTreeItems(); - } - await this.#init; const { data, error } = await this.#treeDataSource.getChildrenOf(path); @@ -65,11 +48,6 @@ export class UmbStylesheetTreeRepository return { data, error, asObservable: () => this.#treeStore!.childrenOf(path) }; } - async rootTreeItems() { - await this.#init; - return this.#treeStore!.rootItems; - } - async treeItemsOf(parentPath: string | null) { if (!parentPath) throw new Error('Parent Path is missing'); await this.#init; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts index b69645a95b..a1d7fa9be9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts @@ -21,15 +21,6 @@ export class UmbStylesheetTreeServerDataSource implements UmbTreeDataSource Date: Mon, 13 Nov 2023 15:51:03 +0100 Subject: [PATCH 23/41] remove method on wrong data source --- .../tree/stylesheet-tree.server.data-source.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts index a1d7fa9be9..e48374460a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts @@ -41,19 +41,4 @@ export class UmbStylesheetTreeServerDataSource implements UmbTreeDataSource) { - return tryExecuteAndNotify( - this.#host, - StylesheetResource.getStylesheetItem({ - path, - }), - ); - } } From 520bed5d661cd5bdef795a790b2c6dae300092b9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 16:03:16 +0100 Subject: [PATCH 24/41] Revert "remove unused" This reverts commit 24831d07f9893ab27c919255b93d823357135fd1. --- .../tree/stylesheet-tree.repository.ts | 22 +++++++++++++++++++ .../stylesheet-tree.server.data-source.ts | 13 ++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index ba84eeedc0..b38b17af75 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -35,8 +35,25 @@ export class UmbStylesheetTreeRepository return { data }; } + async requestRootTreeItems() { + console.log('stylesheet root'); + await this.#init; + + const { data, error } = await this.#treeDataSource.getRootItems(); + + if (data) { + this.#treeStore?.appendItems(data.items); + } + + return { data, error, asObservable: () => this.#treeStore!.rootItems }; + } + async requestTreeItemsOf(path: string | null) { if (path === undefined) throw new Error('Cannot request tree item with missing path'); + if (path === null || path === '/' || path === '') { + return this.requestRootTreeItems(); + } + await this.#init; const { data, error } = await this.#treeDataSource.getChildrenOf(path); @@ -48,6 +65,11 @@ export class UmbStylesheetTreeRepository return { data, error, asObservable: () => this.#treeStore!.childrenOf(path) }; } + async rootTreeItems() { + await this.#init; + return this.#treeStore!.rootItems; + } + async treeItemsOf(parentPath: string | null) { if (!parentPath) throw new Error('Parent Path is missing'); await this.#init; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts index e48374460a..aed02ea8a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts @@ -21,6 +21,15 @@ export class UmbStylesheetTreeServerDataSource implements UmbTreeDataSource Date: Mon, 13 Nov 2023 16:04:23 +0100 Subject: [PATCH 25/41] Update stylesheet-tree.repository.ts --- .../stylesheets/tree/stylesheet-tree.repository.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index b38b17af75..a1448d71d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -36,7 +36,6 @@ export class UmbStylesheetTreeRepository } async requestRootTreeItems() { - console.log('stylesheet root'); await this.#init; const { data, error } = await this.#treeDataSource.getRootItems(); @@ -50,10 +49,6 @@ export class UmbStylesheetTreeRepository async requestTreeItemsOf(path: string | null) { if (path === undefined) throw new Error('Cannot request tree item with missing path'); - if (path === null || path === '/' || path === '') { - return this.requestRootTreeItems(); - } - await this.#init; const { data, error } = await this.#treeDataSource.getChildrenOf(path); From 04a2a1e9c7a3bff7e9a7f38ffe2bd965b4349716 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 16:09:18 +0100 Subject: [PATCH 26/41] add check to return rootItems if parentId is null --- .../src/packages/core/store/file-system-tree.store.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-tree.store.ts index c78093184d..609510bb92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-tree.store.ts @@ -31,9 +31,11 @@ export class UmbFileSystemTreeStore * @memberof UmbFileSystemTreeStore */ childrenOf(parentPath: string | null) { - return this._data.asObservablePart((items) => - items.filter((item) => item.path?.startsWith(parentPath + '/') || parentPath === null) - ); + if (parentPath === null) { + return this.rootItems; + } + + return this._data.asObservablePart((items) => items.filter((item) => item.path?.startsWith(parentPath + '/'))); } /** From 1ef05878507a1e2bda21f3fb6f4d92f2daa06459 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 13 Nov 2023 16:15:56 +0100 Subject: [PATCH 27/41] Revert "remove method on wrong data source" This reverts commit 8ab930f237faa5a0ee258c83114e32ecdf6d0ab7. --- .../tree/stylesheet-tree.server.data-source.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts index aed02ea8a3..b69645a95b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts @@ -52,4 +52,19 @@ export class UmbStylesheetTreeServerDataSource implements UmbTreeDataSource) { + return tryExecuteAndNotify( + this.#host, + StylesheetResource.getStylesheetItem({ + path, + }), + ); + } } From 5d8755892af963ff26ac9ccde960121b3199245f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 10:17:30 +0100 Subject: [PATCH 28/41] add missing export --- src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts index adc28974bc..54e9c0c197 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts @@ -3,3 +3,4 @@ export * from './store-base.js'; export * from './store.interface.js'; export * from './store.js'; export * from './entity-item.store.js'; +export * from './file-system-item.store.js'; From 355f2e9b7f847d179808eb32de01a60fe8065136 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 10:17:40 +0100 Subject: [PATCH 29/41] correct import --- .../stylesheets/tree/stylesheet-tree.repository.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index a1448d71d1..9a83930604 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -1,13 +1,13 @@ import { UmbStylesheetTreeServerDataSource } from './stylesheet-tree.server.data-source.js'; import { UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, UmbStylesheetTreeStore } from './stylesheet-tree.store.js'; import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbRepositoryBase, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; -import { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/tree'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import { UmbFileSystemTreeRootModel, UmbTreeRepository } from '@umbraco-cms/backoffice/tree'; import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbStylesheetTreeRepository extends UmbRepositoryBase - implements UmbTreeRepository + implements UmbTreeRepository { #init; #treeDataSource; From d5e7bc50fe105e1d83d022edfc59e890e97c5dbf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 10:54:39 +0100 Subject: [PATCH 30/41] reuse item repository for stylesheets --- .../item/stylesheet-item.repository.ts | 51 +++---------------- ... => stylesheet-item.server.data-source.ts} | 0 2 files changed, 6 insertions(+), 45 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/{stylesheet-item.server.data.ts => stylesheet-item.server.data-source.ts} (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts index d0f31aa9ee..5d5cc7230d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts @@ -1,50 +1,11 @@ -import { UmbStylesheetItemServerDataSource } from './stylesheet-item.server.data.js'; -import { UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN, UmbStylesheetItemStore } from './stylesheet-item.store.js'; +import { UmbStylesheetItemServerDataSource } from './stylesheet-item.server.data-source.js'; +import { UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN } from './stylesheet-item.store.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbItemDataSource, UmbItemRepository, UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; -import { StylesheetItemResponseModel, UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; - -export class UmbStylesheetItemRepository extends UmbRepositoryBase implements UmbItemRepository { - #init; - #itemSource: UmbItemDataSource; - #itemStore?: UmbStylesheetItemStore; +import { StylesheetItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; +export class UmbStylesheetItemRepository extends UmbItemRepositoryBase { constructor(host: UmbControllerHost) { - super(host); - this.#itemSource = new UmbStylesheetItemServerDataSource(host); - - this.#init = this.consumeContext(UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN, (instance) => { - this.#itemStore = instance; - }).asPromise(); - } - - /** - * Requests the stylesheet items for the given ids - * @param {Array} ids - * @return {*} - * @memberof UmbStylesheetItemRepository - */ - async requestItems(ids: Array) { - if (!ids) throw new Error('Ids are missing'); - await this.#init; - - const { data, error } = await this.#itemSource.getItems(ids); - - if (data) { - this.#itemStore?.appendItems(data); - } - - return { data, error, asObservable: () => this.#itemStore!.items(ids) }; - } - - /** - * Returns a promise with an observable of the stylesheet items for the given ids - * @param {Array} ids - * @return {Promise>} - * @memberof UmbStylesheetItemRepository - */ - async items(ids: Array) { - await this.#init; - return this.#itemStore!.items(ids); + super(host, UmbStylesheetItemServerDataSource, UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts From c9de84bfc2fa3e89fc99ff21904f417e57c2055c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 11:08:23 +0100 Subject: [PATCH 31/41] reuse tree repository base --- .../tree/stylesheet-tree.repository.ts | 61 ++----------------- 1 file changed, 5 insertions(+), 56 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index 9a83930604..a86e598e48 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -1,29 +1,14 @@ import { UmbStylesheetTreeServerDataSource } from './stylesheet-tree.server.data-source.js'; -import { UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, UmbStylesheetTreeStore } from './stylesheet-tree.store.js'; -import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; -import { UmbFileSystemTreeRootModel, UmbTreeRepository } from '@umbraco-cms/backoffice/tree'; +import { UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN } from './stylesheet-tree.store.js'; +import { UmbEntityTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export class UmbStylesheetTreeRepository - extends UmbRepositoryBase - implements UmbTreeRepository -{ - #init; - #treeDataSource; - #treeStore?: UmbStylesheetTreeStore; - +export class UmbStylesheetTreeRepository extends UmbEntityTreeRepositoryBase { constructor(host: UmbControllerHost) { - super(host); - this.#treeDataSource = new UmbStylesheetTreeServerDataSource(this); - - this.#init = this.consumeContext(UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, (instance) => { - this.#treeStore = instance; - }).asPromise(); + super(host, UmbStylesheetTreeServerDataSource, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN); } - async requestTreeRoot() { - await this.#init; + async requestTreeRoot() { const data = { path: null, type: 'stylesheet-root', @@ -34,40 +19,4 @@ export class UmbStylesheetTreeRepository return { data }; } - - async requestRootTreeItems() { - await this.#init; - - const { data, error } = await this.#treeDataSource.getRootItems(); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - return { data, error, asObservable: () => this.#treeStore!.rootItems }; - } - - async requestTreeItemsOf(path: string | null) { - if (path === undefined) throw new Error('Cannot request tree item with missing path'); - await this.#init; - - const { data, error } = await this.#treeDataSource.getChildrenOf(path); - - if (data) { - this.#treeStore!.appendItems(data.items); - } - - return { data, error, asObservable: () => this.#treeStore!.childrenOf(path) }; - } - - async rootTreeItems() { - await this.#init; - return this.#treeStore!.rootItems; - } - - async treeItemsOf(parentPath: string | null) { - if (!parentPath) throw new Error('Parent Path is missing'); - await this.#init; - return this.#treeStore!.childrenOf(parentPath); - } } From 72c82519f47475d9cc896ca6c5ab4c955e3febc5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 11:11:43 +0100 Subject: [PATCH 32/41] make tree repository naming more generic. It can be used for both files and entities --- .../tree/data-type-tree.repository.ts | 4 +-- .../core/tree/entity-tree.repository.ts | 30 +++++++++---------- .../src/packages/core/tree/index.ts | 2 +- .../tree/document-type-tree.repository.ts | 4 +-- .../tree/stylesheet-tree.repository.ts | 4 +-- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts index 4c0ed2bdde..d1da746957 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts @@ -1,4 +1,4 @@ -import { UmbEntityTreeRepositoryBase } from '../../tree/entity-tree.repository.js'; +import { UmbTreeRepositoryBase } from '../../tree/entity-tree.repository.js'; import { DATA_TYPE_ROOT_ENTITY_TYPE } from '../entities.js'; import { UmbDataTypeTreeServerDataSource } from './data-type.tree.server.data.js'; import { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from './data-type.tree.store.js'; @@ -7,7 +7,7 @@ import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export class UmbDataTypeTreeRepository - extends UmbEntityTreeRepositoryBase + extends UmbTreeRepositoryBase implements UmbApi { constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts index fd7e6146c9..28741c462f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts @@ -7,7 +7,7 @@ import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export class UmbEntityTreeRepositoryBase< +export class UmbTreeRepositoryBase< TreeItemType extends UmbEntityTreeItemModel, TreeRootType extends UmbEntityTreeRootModel, > @@ -34,7 +34,7 @@ export class UmbEntityTreeRepositoryBase< /** * Request the tree root item * @return {*} - * @memberof UmbEntityTreeRepositoryBase + * @memberof UmbTreeRepositoryBase */ async requestTreeRoot() { if (!this.#treeSource.getTreeRoot?.()) { @@ -47,7 +47,7 @@ export class UmbEntityTreeRepositoryBase< /** * Requests root items of a tree * @return {*} - * @memberof UmbEntityTreeRepositoryBase + * @memberof UmbTreeRepositoryBase */ async requestRootTreeItems() { await this._init; @@ -63,27 +63,27 @@ export class UmbEntityTreeRepositoryBase< /** * Requests tree items of a given parent - * @param {(string | null)} parentId + * @param {(string | null)} parentUnique * @return {*} - * @memberof UmbEntityTreeRepositoryBase + * @memberof UmbTreeRepositoryBase */ - async requestTreeItemsOf(parentId: string | null) { - if (parentId === undefined) throw new Error('Parent id is missing'); + async requestTreeItemsOf(parentUnique: string | null) { + if (parentUnique === undefined) throw new Error('Parent unique is missing'); await this._init; - const { data, error } = await this.#treeSource.getChildrenOf(parentId); + const { data, error } = await this.#treeSource.getChildrenOf(parentUnique); if (data) { this._treeStore!.appendItems(data.items); } - return { data, error, asObservable: () => this._treeStore!.childrenOf(parentId) }; + return { data, error, asObservable: () => this._treeStore!.childrenOf(parentUnique) }; } /** * Returns a promise with an observable of tree root items * @return {*} - * @memberof UmbEntityTreeRepositoryBase + * @memberof UmbTreeRepositoryBase */ async rootTreeItems() { await this._init; @@ -92,13 +92,13 @@ export class UmbEntityTreeRepositoryBase< /** * Returns a promise with an observable of children items of a given parent - * @param {(string | null)} parentId + * @param {(string | null)} parentUnique * @return {*} - * @memberof UmbEntityTreeRepositoryBase + * @memberof UmbTreeRepositoryBase */ - async treeItemsOf(parentId: string | null) { - if (parentId === undefined) throw new Error('Parent id is missing'); + async treeItemsOf(parentUnique: string | null) { + if (parentUnique === undefined) throw new Error('Parent unique is missing'); await this._init; - return this._treeStore!.childrenOf(parentId); + return this._treeStore!.childrenOf(parentUnique); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index a4dffc04f6..6d0f7c6661 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -13,4 +13,4 @@ export * from './tree-store.interface.js'; export * from './entity-tree-store.js'; export * from './file-system-tree.store.js'; -export { UmbEntityTreeRepositoryBase } from './entity-tree.repository.js'; +export { UmbTreeRepositoryBase } from './entity-tree.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts index cc29803cbc..8fa85338e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts @@ -2,12 +2,12 @@ import { DOCUMENT_TYPE_ROOT_ENTITY_TYPE } from '../index.js'; import { UmbDocumentTypeTreeServerDataSource } from './document-type.tree.server.data-source.js'; import { UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT } from './document-type.tree.store.js'; import { UmbDocumentTypeTreeItemModel, UmbDocumentTypeTreeRootModel } from './types.js'; -import { UmbEntityTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; +import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export class UmbDocumentTypeTreeRepository - extends UmbEntityTreeRepositoryBase + extends UmbTreeRepositoryBase implements UmbApi { constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts index a86e598e48..d080059d08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -1,9 +1,9 @@ import { UmbStylesheetTreeServerDataSource } from './stylesheet-tree.server.data-source.js'; import { UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN } from './stylesheet-tree.store.js'; -import { UmbEntityTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; +import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export class UmbStylesheetTreeRepository extends UmbEntityTreeRepositoryBase { +export class UmbStylesheetTreeRepository extends UmbTreeRepositoryBase { constructor(host: UmbControllerHost) { super(host, UmbStylesheetTreeServerDataSource, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN); } From 0a5a949c2306cd4502ca4bb62936644549c18fc7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 11:20:51 +0100 Subject: [PATCH 33/41] align naming and exports --- .../core/data-type/tree/data-type-tree.repository.ts | 2 +- src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts | 2 +- .../{entity-tree.repository.ts => tree-repository-base.ts} | 0 .../src/packages/templating/stylesheets/repository/index.ts | 1 + .../templating/stylesheets/repository/item/index.ts | 3 +++ .../templating/stylesheets/repository/item/manifests.ts | 6 ++++-- .../repository/item/stylesheet-item.repository.ts | 4 ++-- .../stylesheets/repository/item/stylesheet-item.store.ts | 6 ++---- 8 files changed, 14 insertions(+), 10 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{entity-tree.repository.ts => tree-repository-base.ts} (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts index d1da746957..e3686a7fdf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts @@ -1,4 +1,4 @@ -import { UmbTreeRepositoryBase } from '../../tree/entity-tree.repository.js'; +import { UmbTreeRepositoryBase } from '../../tree/tree-repository-base.js'; import { DATA_TYPE_ROOT_ENTITY_TYPE } from '../entities.js'; import { UmbDataTypeTreeServerDataSource } from './data-type.tree.server.data.js'; import { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from './data-type.tree.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index 6d0f7c6661..5f775743d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -13,4 +13,4 @@ export * from './tree-store.interface.js'; export * from './entity-tree-store.js'; export * from './file-system-tree.store.js'; -export { UmbTreeRepositoryBase } from './entity-tree.repository.js'; +export { UmbTreeRepositoryBase } from './tree-repository-base.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository-base.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository-base.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts index c95f93399b..b790807357 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts @@ -1 +1,2 @@ export * from './stylesheet.repository.js'; +export * from './item/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/index.ts new file mode 100644 index 0000000000..929e43c0f8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/index.ts @@ -0,0 +1,3 @@ +export { UmbStylesheetItemRepository } from './stylesheet-item.repository.js'; +export { UMB_STYLESHEET_ITEM_REPOSITORY_ALIAS, UMB_STYLESHEET_ITEM_STORE_ALIAS } from './manifests.js'; +export { UMB_STYLESHEET_ITEM_STORE_CONTEXT } from './stylesheet-item.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts index 70162ca789..97aaa9753e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts @@ -2,10 +2,12 @@ import { UmbStylesheetItemStore } from './stylesheet-item.store.js'; import { UmbStylesheetItemRepository } from './stylesheet-item.repository.js'; import type { ManifestRepository, ManifestItemStore } from '@umbraco-cms/backoffice/extension-registry'; -export const STYLESHEET_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.StylesheetItem'; +export const UMB_STYLESHEET_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet.Item'; +export const UMB_STYLESHEET_ITEM_STORE_ALIAS = 'Umb.ItemStore.Stylesheet'; + const repository: ManifestRepository = { type: 'repository', - alias: STYLESHEET_ITEM_REPOSITORY_ALIAS, + alias: UMB_STYLESHEET_ITEM_REPOSITORY_ALIAS, name: 'Stylesheet Item Repository', api: UmbStylesheetItemRepository, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts index 5d5cc7230d..9cc0cc8198 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts @@ -1,11 +1,11 @@ import { UmbStylesheetItemServerDataSource } from './stylesheet-item.server.data-source.js'; -import { UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN } from './stylesheet-item.store.js'; +import { UMB_STYLESHEET_ITEM_STORE_CONTEXT } from './stylesheet-item.store.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { StylesheetItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; export class UmbStylesheetItemRepository extends UmbItemRepositoryBase { constructor(host: UmbControllerHost) { - super(host, UmbStylesheetItemServerDataSource, UMB_STYLESHEET_ITEM_STORE_CONTEXT_TOKEN); + super(host, UmbStylesheetItemServerDataSource, UMB_STYLESHEET_ITEM_STORE_CONTEXT); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts index f621751a98..661cc27988 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts @@ -17,10 +17,8 @@ export class UmbStylesheetItemStore extends UmbFileSystemItemStore( - 'UmbStylesheetItemStore', -); +export const UMB_STYLESHEET_ITEM_STORE_CONTEXT = new UmbContextToken('UmbStylesheetItemStore'); From 8b3191251b0983e99ddc11699399e9f19b1aa5dc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 12:10:19 +0100 Subject: [PATCH 34/41] prefix consts --- .../packages/templating/stylesheets/config.ts | 12 +++--- .../stylesheets/entity-actions/manifests.ts | 42 ++++++++++++------- .../stylesheets/menu-item/manifests.ts | 4 +- .../stylesheets/repository/manifests.ts | 4 +- .../templating/stylesheets/tree/manifests.ts | 18 ++++---- 5 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts index 08a4412903..e3e7e87feb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts @@ -1,12 +1,12 @@ -export const STYLESHEET_ENTITY_TYPE = 'stylesheet'; +export const UMB_STYLESHEET_ENTITY_TYPE = 'stylesheet'; +export const UMB_STYLESHEET_ROOT_ENTITY_TYPE = 'stylesheet-root'; -export const STYLESHEET_ROOT_ENTITY_TYPE = 'stylesheet-root'; -export const STYLESHEET_FOLDER_ENTITY_TYPE = 'stylesheet-folder'; -export const STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE = 'stylesheet-folder-empty'; +export const UMB_STYLESHEET_FOLDER_ENTITY_TYPE = 'stylesheet-folder'; +export const UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE = 'stylesheet-folder-empty'; -export const STYLESHEET_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet'; +export const UMB_STYLESHEET_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet'; export const UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Stylesheet.Tree'; export const UMB_STYLESHEET_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Stylesheet'; -export const STYLESHEET_STORE_ALIAS = 'Umb.Store.Stylesheet'; +export const UMB_STYLESHEET_STORE_ALIAS = 'Umb.Store.Stylesheet'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts index d21cd9a82b..8fa1833689 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts @@ -1,9 +1,9 @@ import { - STYLESHEET_ENTITY_TYPE, - STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, - STYLESHEET_FOLDER_ENTITY_TYPE, - STYLESHEET_REPOSITORY_ALIAS, - STYLESHEET_ROOT_ENTITY_TYPE, + UMB_STYLESHEET_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_ENTITY_TYPE, + UMB_STYLESHEET_REPOSITORY_ALIAS, + UMB_STYLESHEET_ROOT_ENTITY_TYPE, } from '../config.js'; import { UmbCreateRTFStylesheetAction } from './create/create-rtf.action.js'; import { UmbCreateStylesheetAction } from './create/create.action.js'; @@ -26,8 +26,8 @@ const stylesheetActions: Array = [ meta: { icon: 'icon-trash', label: 'Delete', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [UMB_STYLESHEET_ENTITY_TYPE], }, }, ]; @@ -43,8 +43,12 @@ const stylesheetFolderActions: Array = [ meta: { icon: 'icon-script', label: 'New stylesheet file', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_FOLDER_ENTITY_TYPE, STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, STYLESHEET_ROOT_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [ + UMB_STYLESHEET_FOLDER_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, + UMB_STYLESHEET_ROOT_ENTITY_TYPE, + ], }, }, { @@ -55,8 +59,12 @@ const stylesheetFolderActions: Array = [ meta: { icon: 'icon-script', label: 'New Rich Text Editor style sheet file', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_FOLDER_ENTITY_TYPE, STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, STYLESHEET_ROOT_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [ + UMB_STYLESHEET_FOLDER_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, + UMB_STYLESHEET_ROOT_ENTITY_TYPE, + ], }, }, { @@ -67,8 +75,8 @@ const stylesheetFolderActions: Array = [ meta: { icon: 'icon-trash', label: 'Remove folder', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE], }, }, { @@ -79,8 +87,12 @@ const stylesheetFolderActions: Array = [ meta: { icon: 'icon-add', label: 'Create folder', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, STYLESHEET_FOLDER_ENTITY_TYPE, STYLESHEET_ROOT_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [ + UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_ENTITY_TYPE, + UMB_STYLESHEET_ROOT_ENTITY_TYPE, + ], }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/menu-item/manifests.ts index 287fa5a01b..4109f5071c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/menu-item/manifests.ts @@ -1,4 +1,4 @@ -import { STYLESHEET_TREE_ALIAS } from '../tree/manifests.js'; +import { UMB_STYLESHEET_TREE_ALIAS } from '../tree/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestTypes = { @@ -10,7 +10,7 @@ const menuItem: ManifestTypes = { meta: { label: 'Stylesheets', icon: 'icon-folder', - treeAlias: STYLESHEET_TREE_ALIAS, + treeAlias: UMB_STYLESHEET_TREE_ALIAS, menus: ['Umb.Menu.Templating'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts index c26ebfef2f..b5ff9592cf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts @@ -1,11 +1,11 @@ -import { STYLESHEET_REPOSITORY_ALIAS } from '../config.js'; +import { UMB_STYLESHEET_REPOSITORY_ALIAS } from '../config.js'; import { UmbStylesheetRepository } from './stylesheet.repository.js'; import { manifests as itemManifests } from './item/manifests.js'; import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; const repository: ManifestRepository = { type: 'repository', - alias: STYLESHEET_REPOSITORY_ALIAS, + alias: UMB_STYLESHEET_REPOSITORY_ALIAS, name: 'Stylesheet Repository', api: UmbStylesheetRepository, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts index 763ac0a02a..ab4d1f9bd7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts @@ -1,4 +1,4 @@ -import { STYLESHEET_ENTITY_TYPE } from '../config.js'; +import { UMB_STYLESHEET_ENTITY_TYPE } from '../config.js'; import { UmbStylesheetTreeRepository } from './stylesheet-tree.repository.js'; import { UmbStylesheetTreeStore } from './stylesheet-tree.store.js'; import type { @@ -8,31 +8,31 @@ import type { ManifestTreeStore, } from '@umbraco-cms/backoffice/extension-registry'; -export const STYLESHEET_TREE_ALIAS = 'Umb.Tree.Stylesheet'; -export const STYLESHEET_TREE_REPOSITORY_ALIAS = 'Umb.Repository.StylesheetTree'; -export const STYLESHEET_TREE_STORE_ALIAS = 'Umb.Store.StylesheetTree'; +export const UMB_STYLESHEET_TREE_ALIAS = 'Umb.Tree.Stylesheet'; +export const UMB_STYLESHEET_TREE_REPOSITORY_ALIAS = 'Umb.Repository.StylesheetTree'; +export const UMB_STYLESHEET_TREE_STORE_ALIAS = 'Umb.Store.StylesheetTree'; const treeRepository: ManifestRepository = { type: 'repository', - alias: STYLESHEET_TREE_REPOSITORY_ALIAS, + alias: UMB_STYLESHEET_TREE_REPOSITORY_ALIAS, name: 'Stylesheet Tree Repository', api: UmbStylesheetTreeRepository, }; const treeStore: ManifestTreeStore = { type: 'treeStore', - alias: STYLESHEET_TREE_STORE_ALIAS, + alias: UMB_STYLESHEET_TREE_STORE_ALIAS, name: 'Stylesheet Tree Store', api: UmbStylesheetTreeStore, }; const tree: ManifestTree = { type: 'tree', - alias: STYLESHEET_TREE_ALIAS, + alias: UMB_STYLESHEET_TREE_ALIAS, name: 'Stylesheet Tree', weight: 10, meta: { - repositoryAlias: STYLESHEET_TREE_REPOSITORY_ALIAS, + repositoryAlias: UMB_STYLESHEET_TREE_REPOSITORY_ALIAS, }, }; @@ -42,7 +42,7 @@ const treeItem: ManifestTreeItem = { alias: 'Umb.TreeItem.Stylesheet', name: 'Stylesheet Tree Item', meta: { - entityTypes: ['stylesheet-root', STYLESHEET_ENTITY_TYPE], + entityTypes: ['stylesheet-root', UMB_STYLESHEET_ENTITY_TYPE], }, }; From 0aba6e4b0666aa9422ee0842f8e329196be89771 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 12:15:12 +0100 Subject: [PATCH 35/41] delete unused consts --- .../src/packages/templating/stylesheets/config.ts | 7 ------- .../templating/stylesheets/entity-actions/manifests.ts | 3 ++- .../packages/templating/stylesheets/repository/index.ts | 1 + .../templating/stylesheets/repository/manifests.ts | 3 ++- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts index e3e7e87feb..8dbd996a3e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts @@ -3,10 +3,3 @@ export const UMB_STYLESHEET_ROOT_ENTITY_TYPE = 'stylesheet-root'; export const UMB_STYLESHEET_FOLDER_ENTITY_TYPE = 'stylesheet-folder'; export const UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE = 'stylesheet-folder-empty'; - -export const UMB_STYLESHEET_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet'; - -export const UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Stylesheet.Tree'; -export const UMB_STYLESHEET_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Stylesheet'; - -export const UMB_STYLESHEET_STORE_ALIAS = 'Umb.Store.Stylesheet'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts index 8fa1833689..8d325da4d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts @@ -2,9 +2,10 @@ import { UMB_STYLESHEET_ENTITY_TYPE, UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, UMB_STYLESHEET_FOLDER_ENTITY_TYPE, - UMB_STYLESHEET_REPOSITORY_ALIAS, UMB_STYLESHEET_ROOT_ENTITY_TYPE, } from '../config.js'; + +import { UMB_STYLESHEET_REPOSITORY_ALIAS } from '../repository/index.js'; import { UmbCreateRTFStylesheetAction } from './create/create-rtf.action.js'; import { UmbCreateStylesheetAction } from './create/create.action.js'; import { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts index b790807357..3ee1d14e58 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts @@ -1,2 +1,3 @@ export * from './stylesheet.repository.js'; export * from './item/index.js'; +export { UMB_STYLESHEET_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts index b5ff9592cf..184a4de42b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts @@ -1,8 +1,9 @@ -import { UMB_STYLESHEET_REPOSITORY_ALIAS } from '../config.js'; import { UmbStylesheetRepository } from './stylesheet.repository.js'; import { manifests as itemManifests } from './item/manifests.js'; import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; +export const UMB_STYLESHEET_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet'; + const repository: ManifestRepository = { type: 'repository', alias: UMB_STYLESHEET_REPOSITORY_ALIAS, From cd8ab08a591b0f99c1060c9c8b240f11066129e8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 12:16:10 +0100 Subject: [PATCH 36/41] rename config to entity type --- .../packages/templating/stylesheets/entity-actions/manifests.ts | 2 +- .../templating/stylesheets/{config.ts => entity-type.ts} | 0 .../src/packages/templating/stylesheets/tree/manifests.ts | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/{config.ts => entity-type.ts} (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts index 8d325da4d0..4c1da9ff30 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts @@ -3,7 +3,7 @@ import { UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, UMB_STYLESHEET_FOLDER_ENTITY_TYPE, UMB_STYLESHEET_ROOT_ENTITY_TYPE, -} from '../config.js'; +} from '../entity-type.js'; import { UMB_STYLESHEET_REPOSITORY_ALIAS } from '../repository/index.js'; import { UmbCreateRTFStylesheetAction } from './create/create-rtf.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-type.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/config.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-type.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts index ab4d1f9bd7..1ee6d92c47 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_STYLESHEET_ENTITY_TYPE } from '../config.js'; +import { UMB_STYLESHEET_ENTITY_TYPE } from '../entity-type.js'; import { UmbStylesheetTreeRepository } from './stylesheet-tree.repository.js'; import { UmbStylesheetTreeStore } from './stylesheet-tree.store.js'; import type { From 27170ce8ee4969e6629b30b12f7387c5d0d1b032 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 13:40:54 +0100 Subject: [PATCH 37/41] add folder repository base class --- .../folder/data-type-folder.repository.ts | 69 +------------ ...=> data-type-folder.server.data-source.ts} | 41 +++++--- .../folder-data-source.interface.ts | 14 --- .../core/repository/data-source/index.ts | 1 - .../repository/folder-repository.interface.ts | 36 ------- .../folder/folder-data-source.interface.ts | 15 +++ .../folder/folder-repository-base.ts | 96 +++++++++++++++++++ .../folder/folder-repository.interface.ts | 35 +++++++ .../packages/core/repository/folder/index.ts | 4 + .../packages/core/repository/folder/types.ts | 11 +++ .../src/packages/core/repository/index.ts | 2 +- 11 files changed, 195 insertions(+), 129 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/{data-type-folder.server.data.ts => data-type-folder.server.data-source.ts} (78%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.repository.ts index 31fc43a1eb..8aab6f05e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.repository.ts @@ -1,69 +1,10 @@ -import { UmbDataTypeRepositoryBase } from '../data-type-repository-base.js'; -import { createFolderTreeItem } from '../utils.js'; -import { UmbDataTypeFolderServerDataSource } from './data-type-folder.server.data.js'; -import type { UmbFolderRepository, UmbFolderDataSource } from '@umbraco-cms/backoffice/repository'; +import { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from '../../tree/data-type.tree.store.js'; +import { UmbDataTypeFolderServerDataSource } from './data-type-folder.server.data-source.js'; +import { UmbFolderRepositoryBase } from '@umbraco-cms/backoffice/repository'; import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { CreateFolderRequestModel, FolderModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -export class UmbDataTypeFolderRepository extends UmbDataTypeRepositoryBase implements UmbFolderRepository { - #folderSource: UmbFolderDataSource; +export class UmbDataTypeFolderRepository extends UmbFolderRepositoryBase { constructor(host: UmbControllerHost) { - super(host); - this.#folderSource = new UmbDataTypeFolderServerDataSource(this); - } - - async createFolderScaffold(parentId: string | null) { - if (parentId === undefined) throw new Error('Parent id is missing'); - await this._init; - return this.#folderSource.createScaffold(parentId); - } - - // TODO: temp create type until backend is ready. Remove the id addition when new types are generated. - async createFolder(folderRequest: CreateFolderRequestModel & { id?: string | undefined }) { - if (!folderRequest) throw new Error('folder request is missing'); - await this._init; - - const { error } = await this.#folderSource.insert(folderRequest); - - if (!error) { - // TODO: We need to push a new item to the tree store to update the tree. How do we want to create the tree items? - const folderTreeItem = createFolderTreeItem(folderRequest); - this._treeStore!.appendItems([folderTreeItem]); - } - - return { error }; - } - - async deleteFolder(id: string) { - if (!id) throw new Error('Key is missing'); - await this._init; - - const { error } = await this.#folderSource.delete(id); - - if (!error) { - this._treeStore!.removeItem(id); - } - - return { error }; - } - - async updateFolder(id: string, folder: FolderModelBaseModel) { - if (!id) throw new Error('Key is missing'); - if (!folder) throw new Error('Folder data is missing'); - await this._init; - - const { error } = await this.#folderSource.update(id, folder); - - if (!error) { - this._treeStore!.updateItem(id, { name: folder.name }); - } - - return { error }; - } - - async requestFolder(id: string) { - if (!id) throw new Error('Key is missing'); - await this._init; - return await this.#folderSource.get(id); + super(host, UmbDataTypeFolderServerDataSource, UMB_DATA_TYPE_TREE_STORE_CONTEXT); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.server.data-source.ts similarity index 78% rename from src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.server.data-source.ts index edaeabc060..3712487d69 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.server.data-source.ts @@ -50,12 +50,12 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { * @memberof UmbDataTypeFolderServerDataSource */ async get(id: string) { - if (!id) throw new Error('Key is missing'); + if (!id) throw new Error('Id is missing'); return tryExecuteAndNotify( this.#host, DataTypeResource.getDataTypeFolderById({ id: id, - }) + }), ); } @@ -65,13 +65,22 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { * @return {*} * @memberof UmbDataTypeFolderServerDataSource */ - async insert(folder: CreateFolderRequestModel) { - if (!folder) throw new Error('Folder is missing'); + async insert(id: string, parentId: string | null, name: string) { + if (!id) throw new Error('Unique is missing'); + if (parentId === undefined) throw new Error('Parent unique is missing'); + if (!name) throw new Error('Name is missing'); + + const requestBody: CreateFolderRequestModel = { + id: id, + parentId: parentId, + name, + }; + return tryExecuteAndNotify( this.#host, DataTypeResource.postDataTypeFolder({ - requestBody: folder, - }) + requestBody, + }), ); } @@ -81,15 +90,20 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { * @return {*} * @memberof UmbDataTypeFolderServerDataSource */ - async update(id: string, folder: FolderModelBaseModel) { + async update(id: string, name: string) { if (!id) throw new Error('Key is missing'); - if (!id) throw new Error('Folder data is missing'); + if (!name) throw new Error('Folder name is missing'); + + const requestBody: FolderModelBaseModel = { + name, + }; + return tryExecuteAndNotify( this.#host, DataTypeResource.putDataTypeFolderById({ - id: id, - requestBody: folder, - }) + id, + requestBody, + }), ); } @@ -100,12 +114,13 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { * @memberof UmbDataTypeServerDataSource */ async delete(id: string) { - if (!id) throw new Error('Key is missing'); + if (!id) throw new Error('Id is missing'); + return tryExecuteAndNotify( this.#host, DataTypeResource.deleteDataTypeFolderById({ id: id, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts deleted file mode 100644 index f96755e6a3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { DataSourceResponse } from './data-source-response.interface.js'; -import { - CreateFolderRequestModel, - FolderResponseModel, - UpdateFolderResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; - -export interface UmbFolderDataSource { - createScaffold(parentId: string | null): Promise>; - get(unique: string): Promise>; - insert(data: CreateFolderRequestModel): Promise>; - update(unique: string, data: CreateFolderRequestModel): Promise>; - delete(unique: string): Promise; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts index 77227e517f..4980a9bbe6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts @@ -4,6 +4,5 @@ export * from './data-source-response.interface.js'; export * from './data-source.interface.js'; export * from './extend-data-source-paged-response-data.function.js'; export * from './extend-data-source-response-data.function.js'; -export * from './folder-data-source.interface.js'; export * from './move-data-source.interface.js'; export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts deleted file mode 100644 index ddf9268ddc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { - CreateFolderRequestModel, - FolderModelBaseModel, - FolderResponseModel, - ProblemDetails, - UpdateFolderResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; -import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; - -export interface UmbFolderRepository extends UmbApi { - createFolderScaffold(parentId: string | null): Promise<{ - data?: FolderResponseModel; - error?: ProblemDetails; - }>; - createFolder(folderRequest: CreateFolderRequestModel): Promise<{ - data?: string; - error?: ProblemDetails; - }>; - - requestFolder(unique: string): Promise<{ - data?: FolderResponseModel; - error?: ProblemDetails; - }>; - - updateFolder( - unique: string, - folder: FolderModelBaseModel, - ): Promise<{ - data?: UpdateFolderResponseModel; - error?: ProblemDetails; - }>; - - deleteFolder(id: string): Promise<{ - error?: ProblemDetails; - }>; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts new file mode 100644 index 0000000000..d646004adf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts @@ -0,0 +1,15 @@ +import { DataSourceResponse } from '../data-source/data-source-response.interface.js'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { FolderResponseModel, UpdateFolderResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export interface UmbFolderDataSourceConstructor { + new (host: UmbControllerHost): UmbFolderDataSource; +} + +export interface UmbFolderDataSource { + createScaffold(parentUnique: string | null): Promise>; + get(unique: string): Promise>; + insert(unique: string, parentUnique: string | null, name: string): Promise>; + update(unique: string, name: string): Promise>; + delete(unique: string): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts new file mode 100644 index 0000000000..cddd54779f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts @@ -0,0 +1,96 @@ +import { UmbRepositoryBase } from '../repository-base.js'; +import { type UmbFolderRepository } from './folder-repository.interface.js'; +import type { UmbFolderDataSource, UmbFolderDataSourceConstructor } from './folder-data-source.interface.js'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbTreeStore } from '@umbraco-cms/backoffice/tree'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export class UmbFolderRepositoryBase extends UmbRepositoryBase implements UmbFolderRepository { + protected _init: Promise; + protected _treeStore?: UmbTreeStore; + #folderDataSource: UmbFolderDataSource; + + constructor( + host: UmbControllerHost, + folderDataSource: UmbFolderDataSourceConstructor, + treeStoreContextAlias: string | UmbContextToken, + ) { + super(host); + this.#folderDataSource = new folderDataSource(this); + + this._init = this.consumeContext(treeStoreContextAlias, (instance) => { + this._treeStore = instance as UmbTreeStore; + }).asPromise(); + } + + async createFolderScaffold(parentUnique: string | null) { + if (parentUnique === undefined) throw new Error('Parent unique is missing'); + await this._init; + return this.#folderDataSource.createScaffold(parentUnique); + } + + async createFolder(unique: string, parentUnique: string | null, name: string) { + if (!unique) throw new Error('Unique is missing'); + if (parentUnique === undefined) throw new Error('Parent unique is missing'); + if (!name) throw new Error('Name is missing'); + await this._init; + + const { error } = await this.#folderDataSource.insert(unique, parentUnique, name); + + /* + if (!error) { + // TODO: We need to push a new item to the tree store to update the tree. How do we want to create the tree items? + const folderTreeItem = createFolderTreeItem(folderRequest); + this._treeStore!.appendItems([folderTreeItem]); + } + */ + + return { error }; + } + + async deleteFolder(id: string) { + if (!id) throw new Error('Key is missing'); + await this._init; + + const { error } = await this.#folderDataSource.delete(id); + + if (!error) { + this._treeStore!.removeItem(id); + } + + return { error }; + } + + /** + * Request a folder by a unique + * @param {string} id + * @param {FolderModelBaseModel} folder + * @return {*} + * @memberof UmbFolderRepositoryBase + */ + async updateFolder(unique: string, name: string) { + if (!unique) throw new Error('Unique is missing'); + if (!name) throw new Error('Folder name is missing'); + await this._init; + + const { error } = await this.#folderDataSource.update(unique, name); + + if (!error) { + this._treeStore!.updateItem(unique, { name }); + } + + return { error }; + } + + /** + * Request a folder by a unique + * @param {string} unique + * @return {*} + * @memberof UmbFolderRepositoryBase + */ + async requestFolder(unique: string) { + if (!unique) throw new Error('Unique is missing'); + await this._init; + return await this.#folderDataSource.get(unique); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts new file mode 100644 index 0000000000..77e636f61a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts @@ -0,0 +1,35 @@ +import type { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +// TODO add response types folder folders +export interface UmbFolderRepository extends UmbApi { + createFolderScaffold(unique: string | null): Promise<{ + data?: any; + error?: ProblemDetails; + }>; + createFolder( + unique: string, + parentUnique: string | null, + name: string, + ): Promise<{ + data?: string; + error?: ProblemDetails; + }>; + + requestFolder(unique: string): Promise<{ + data?: any; + error?: ProblemDetails; + }>; + + updateFolder( + unique: string, + name: string, + ): Promise<{ + data?: any; + error?: ProblemDetails; + }>; + + deleteFolder(unique: string): Promise<{ + error?: ProblemDetails; + }>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/index.ts new file mode 100644 index 0000000000..b0d89c930c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/index.ts @@ -0,0 +1,4 @@ +export { type UmbFolderRepository } from './folder-repository.interface.js'; +export { type UmbFolderDataSource } from './folder-data-source.interface.js'; +export { UmbFolderRepositoryBase } from './folder-repository-base.js'; +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts new file mode 100644 index 0000000000..a9600e93f9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts @@ -0,0 +1,11 @@ +export interface UmbFolderModelBase { + name: string; +} + +export interface UmbEntityFolder { + id: string; +} + +export interface UmbFileSystemFolder { + path: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts index d39abba3d1..53662f5645 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts @@ -1,6 +1,5 @@ export * from './data-source/index.js'; export * from './detail-repository.interface.js'; -export * from './folder-repository.interface.js'; export * from './collection-repository.interface.js'; export * from './move-repository.interface.js'; export * from './copy-repository.interface.js'; @@ -8,3 +7,4 @@ export * from './repository-items.manager.js'; export * from './repository-base.js'; export * from './item/index.js'; +export * from './folder/index.js'; From 0df854bf07fb4ea868507b9dd61b88339b42f1a5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 15:01:08 +0100 Subject: [PATCH 38/41] add local models so we can reuse the repo across entities and file system items --- .../entity-actions/create/create.action.ts | 2 +- .../data-type-create-options-modal.element.ts | 3 ++ .../entity-actions/create/modal/index.ts | 4 +- .../data-type-folder.server.data-source.ts | 50 ++++++------------- .../common/folder/folder-modal.element.ts | 21 +++++--- .../core/modal/token/folder-modal.token.ts | 2 +- .../folder/folder-data-source.interface.ts | 6 +-- .../folder/folder-repository-base.ts | 39 ++++++++++----- .../folder/folder-repository.interface.ts | 12 ++--- .../packages/core/repository/folder/types.ts | 19 ++++--- 10 files changed, 80 insertions(+), 78 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/create.action.ts index 76f398b338..74cd00fb77 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/create.action.ts @@ -20,7 +20,7 @@ export class UmbCreateDataTypeEntityAction extends UmbEntityActionBase this.modalContext?.submit()); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/modal/index.ts index c6565fb240..85e124f71f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/modal/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/modal/index.ts @@ -1,7 +1,7 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbDataTypeCreateOptionsModalData { - parentKey: string | null; + parentId: string | null; } export const UMB_DATA_TYPE_CREATE_OPTIONS_MODAL = new UmbModalToken( @@ -9,5 +9,5 @@ export const UMB_DATA_TYPE_CREATE_OPTIONS_MODAL = new UmbModalToken; @state() - _folder?: FolderResponseModel; + _folder?: UmbFolderModel; @state() _headline?: string; @@ -112,11 +112,18 @@ export class UmbFolderModalElement extends UmbLitElement { this._folder = { ...this._folder, name: folderName }; if (this._isNew) { - const { error: createError } = await this.#repository.createFolder(this._folder); + const { error: createError } = await this.#repository.createFolder({ + unique: this._folder.unique, + parentUnique: this._folder.parentUnique, + name: folderName, + }); error = createError; } else { if (!this.#unique) throw new Error('Unique is required to update folder'); - const { error: updateError } = await this.#repository.updateFolder(this.#unique, this._folder); + const { error: updateError } = await this.#repository.updateFolder({ + unique: this._folder.unique, + name: folderName, + }); error = updateError; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/folder-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/folder-modal.token.ts index a34075ff65..e3460259c2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/folder-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/folder-modal.token.ts @@ -4,7 +4,7 @@ import { FolderResponseModel } from '@umbraco-cms/backoffice/backend-api'; export interface UmbFolderModalData { repositoryAlias: string; unique?: string; - parentUnique?: string | null; + parentUnique: string | null; } export interface UmbFolderModalValue { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts index d646004adf..01e03cf6be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts @@ -1,4 +1,5 @@ import { DataSourceResponse } from '../data-source/data-source-response.interface.js'; +import { UmbCreateFolderModel, UmbUpdateFolderModel } from './types.js'; import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { FolderResponseModel, UpdateFolderResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -7,9 +8,8 @@ export interface UmbFolderDataSourceConstructor { } export interface UmbFolderDataSource { - createScaffold(parentUnique: string | null): Promise>; get(unique: string): Promise>; - insert(unique: string, parentUnique: string | null, name: string): Promise>; - update(unique: string, name: string): Promise>; + insert(args: UmbCreateFolderModel): Promise>; + update(args: UmbUpdateFolderModel): Promise>; delete(unique: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts index cddd54779f..df44c846af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts @@ -4,6 +4,8 @@ import type { UmbFolderDataSource, UmbFolderDataSourceConstructor } from './fold import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbTreeStore } from '@umbraco-cms/backoffice/tree'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbCreateFolderModel, UmbUpdateFolderModel } from './types.js'; +import { UmbId } from '@umbraco-cms/backoffice/id'; export class UmbFolderRepositoryBase extends UmbRepositoryBase implements UmbFolderRepository { protected _init: Promise; @@ -23,19 +25,32 @@ export class UmbFolderRepositoryBase extends UmbRepositoryBase implements UmbFol }).asPromise(); } + /** + * Creates a Data Type folder with the given id from the server + * @param {string} parentId + * @return {*} + * @memberof UmbDataTypeFolderServerDataSource + */ + /* TODO: revisit this method. + Id is currently not used everywhere, but the method is currently overwritten for file system repos. */ async createFolderScaffold(parentUnique: string | null) { if (parentUnique === undefined) throw new Error('Parent unique is missing'); - await this._init; - return this.#folderDataSource.createScaffold(parentUnique); + + const scaffold = { + name: '', + unique: UmbId.new(), + parentUnique, + }; + + return { data: scaffold }; } - async createFolder(unique: string, parentUnique: string | null, name: string) { - if (!unique) throw new Error('Unique is missing'); - if (parentUnique === undefined) throw new Error('Parent unique is missing'); - if (!name) throw new Error('Name is missing'); + async createFolder(args: UmbCreateFolderModel) { + if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); + if (!args.name) throw new Error('Name is missing'); await this._init; - const { error } = await this.#folderDataSource.insert(unique, parentUnique, name); + const { error } = await this.#folderDataSource.insert(args); /* if (!error) { @@ -68,15 +83,15 @@ export class UmbFolderRepositoryBase extends UmbRepositoryBase implements UmbFol * @return {*} * @memberof UmbFolderRepositoryBase */ - async updateFolder(unique: string, name: string) { - if (!unique) throw new Error('Unique is missing'); - if (!name) throw new Error('Folder name is missing'); + async updateFolder(args: UmbUpdateFolderModel) { + if (!args.unique) throw new Error('Unique is missing'); + if (!args.name) throw new Error('Folder name is missing'); await this._init; - const { error } = await this.#folderDataSource.update(unique, name); + const { error } = await this.#folderDataSource.update(args); if (!error) { - this._treeStore!.updateItem(unique, { name }); + this._treeStore!.updateItem(args.unique, { name: args.name }); } return { error }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts index 77e636f61a..f1d21beaa8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts @@ -1,3 +1,4 @@ +import { UmbCreateFolderModel, UmbUpdateFolderModel } from './types.js'; import type { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; @@ -7,11 +8,7 @@ export interface UmbFolderRepository extends UmbApi { data?: any; error?: ProblemDetails; }>; - createFolder( - unique: string, - parentUnique: string | null, - name: string, - ): Promise<{ + createFolder(args: UmbCreateFolderModel): Promise<{ data?: string; error?: ProblemDetails; }>; @@ -21,10 +18,7 @@ export interface UmbFolderRepository extends UmbApi { error?: ProblemDetails; }>; - updateFolder( - unique: string, - name: string, - ): Promise<{ + updateFolder(args: UmbUpdateFolderModel): Promise<{ data?: any; error?: ProblemDetails; }>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts index a9600e93f9..3ca1e96872 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts @@ -1,11 +1,16 @@ -export interface UmbFolderModelBase { +export interface UmbFolderModel { + name: string; + unique: string; + parentUnique: string | null; +} + +export interface UmbCreateFolderModel { + unique?: string; + parentUnique: string | null; name: string; } -export interface UmbEntityFolder { - id: string; -} - -export interface UmbFileSystemFolder { - path: string; +export interface UmbUpdateFolderModel { + unique: string; + name: string; } From 375f8daa1ca982393a5ecec90de41c47ed509e6f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 16:17:45 +0100 Subject: [PATCH 39/41] update tree when folder is created --- .../detail/data-type-detail.repository.ts | 4 +-- .../folder/data-type-folder.repository.ts | 3 +- .../core/data-type/repository/utils.ts | 30 +++++++++++-------- .../folder/folder-repository-base.ts | 14 +++++---- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/detail/data-type-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/detail/data-type-detail.repository.ts index d4db832676..17fdcccc97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/detail/data-type-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/detail/data-type-detail.repository.ts @@ -1,5 +1,5 @@ import { UmbDataTypeRepositoryBase } from '../data-type-repository-base.js'; -import { createTreeItem } from '../utils.js'; +import { dataTypeToTreeItemMapper } from '../utils.js'; import { UmbDataTypeServerDataSource } from './data-type-detail.server.data-source.js'; import type { UmbDetailRepository, UmbDataSource } from '@umbraco-cms/backoffice/repository'; import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -60,7 +60,7 @@ export class UmbDataTypeDetailRepository if (!error) { // TODO: We need to push a new item to the tree store to update the tree. How do we want to create the tree items? - const treeItem = createTreeItem(dataType); + const treeItem = dataTypeToTreeItemMapper(dataType); this._treeStore!.appendItems([treeItem]); //this.#detailStore?.append(dataType); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.repository.ts index 8aab6f05e0..c4fa5735ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/data-type-folder.repository.ts @@ -1,10 +1,11 @@ import { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from '../../tree/data-type.tree.store.js'; +import { folderToDataTypeTreeItemMapper } from '../utils.js'; import { UmbDataTypeFolderServerDataSource } from './data-type-folder.server.data-source.js'; import { UmbFolderRepositoryBase } from '@umbraco-cms/backoffice/repository'; import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbDataTypeFolderRepository extends UmbFolderRepositoryBase { constructor(host: UmbControllerHost) { - super(host, UmbDataTypeFolderServerDataSource, UMB_DATA_TYPE_TREE_STORE_CONTEXT); + super(host, UmbDataTypeFolderServerDataSource, UMB_DATA_TYPE_TREE_STORE_CONTEXT, folderToDataTypeTreeItemMapper); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/utils.ts index 45a7297191..ed958985d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/utils.ts @@ -1,30 +1,34 @@ +import { DATA_TYPE_ENTITY_TYPE } from '../entities.js'; import { CreateDataTypeRequestModel, - CreateFolderRequestModel, + DataTypeTreeItemResponseModel, FolderTreeItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; +import { UmbCreateFolderModel } from '@umbraco-cms/backoffice/repository'; -export const createTreeItem = (item: CreateDataTypeRequestModel): FolderTreeItemResponseModel => { +export const dataTypeToTreeItemMapper = (item: CreateDataTypeRequestModel): DataTypeTreeItemResponseModel => { if (!item) throw new Error('item is null or undefined'); - if (!item.id) throw new Error('item.id is null or undefined'); + if (!item.id) throw new Error('Id is null or undefined'); + if (item.parentId === undefined) throw new Error('ParentId is undefined'); return { - type: 'data-type', - parentId: item.parentId, - name: item.name, id: item.id, - isFolder: false, - isContainer: false, - hasChildren: false, + parentId: item.parentId, + type: DATA_TYPE_ENTITY_TYPE, + name: item.name, }; }; -export const createFolderTreeItem = (item: CreateFolderRequestModel): FolderTreeItemResponseModel => { - if (!item) throw new Error('item is null or undefined'); - if (!item.id) throw new Error('item.id is null or undefined'); +export const folderToDataTypeTreeItemMapper = (folder: UmbCreateFolderModel): FolderTreeItemResponseModel => { + if (!folder) throw new Error('Folder is required'); + if (!folder.unique) throw new Error('Folder unique required'); + if (folder.parentUnique === undefined) throw new Error('Folder parent unique is required'); return { - ...createTreeItem(item), + id: folder.unique, + parentId: folder.parentUnique, + type: DATA_TYPE_ENTITY_TYPE, + name: folder.name, isFolder: true, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts index df44c846af..648d36d428 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts @@ -1,24 +1,29 @@ import { UmbRepositoryBase } from '../repository-base.js'; import { type UmbFolderRepository } from './folder-repository.interface.js'; import type { UmbFolderDataSource, UmbFolderDataSourceConstructor } from './folder-data-source.interface.js'; +import { UmbCreateFolderModel, UmbUpdateFolderModel } from './types.js'; import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbTreeStore } from '@umbraco-cms/backoffice/tree'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbCreateFolderModel, UmbUpdateFolderModel } from './types.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; +export type UmbFolderToTreeItemMapper = (item: UmbCreateFolderModel) => FolderTreeItemType; + export class UmbFolderRepositoryBase extends UmbRepositoryBase implements UmbFolderRepository { protected _init: Promise; protected _treeStore?: UmbTreeStore; #folderDataSource: UmbFolderDataSource; + #folderToTreeItemMapper: UmbFolderToTreeItemMapper; constructor( host: UmbControllerHost, folderDataSource: UmbFolderDataSourceConstructor, - treeStoreContextAlias: string | UmbContextToken, + treeStoreContextAlias: string | UmbContextToken, + folderToTreeItemMapper: UmbFolderToTreeItemMapper, ) { super(host); this.#folderDataSource = new folderDataSource(this); + this.#folderToTreeItemMapper = folderToTreeItemMapper; this._init = this.consumeContext(treeStoreContextAlias, (instance) => { this._treeStore = instance as UmbTreeStore; @@ -52,13 +57,10 @@ export class UmbFolderRepositoryBase extends UmbRepositoryBase implements UmbFol const { error } = await this.#folderDataSource.insert(args); - /* if (!error) { - // TODO: We need to push a new item to the tree store to update the tree. How do we want to create the tree items? - const folderTreeItem = createFolderTreeItem(folderRequest); + const folderTreeItem = this.#folderToTreeItemMapper(args); this._treeStore!.appendItems([folderTreeItem]); } - */ return { error }; } From f50582576107d82591f85957931442421e144ef4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 18:56:26 +0100 Subject: [PATCH 40/41] Revert "Merge branch 'feature-Folder-Repository-Base' into feature/dictionary-delete-and-create-action" This reverts commit 216c79eda0cc3914954f1831f056c44ac63fdbb9, reversing changes made to cd8ab08a591b0f99c1060c9c8b240f11066129e8. --- .../entity-actions/create/create.action.ts | 2 +- .../data-type-create-options-modal.element.ts | 3 - .../entity-actions/create/modal/index.ts | 4 +- .../detail/data-type-detail.repository.ts | 4 +- .../folder/data-type-folder.repository.ts | 70 ++++++++++- ...rce.ts => data-type-folder.server.data.ts} | 69 ++++++----- .../core/data-type/repository/utils.ts | 28 ++--- .../common/folder/folder-modal.element.ts | 21 ++-- .../core/modal/token/folder-modal.token.ts | 2 +- .../folder-data-source.interface.ts | 14 +++ .../core/repository/data-source/index.ts | 1 + .../repository/folder-repository.interface.ts | 36 ++++++ .../folder/folder-data-source.interface.ts | 15 --- .../folder/folder-repository-base.ts | 113 ------------------ .../folder/folder-repository.interface.ts | 29 ----- .../packages/core/repository/folder/index.ts | 4 - .../packages/core/repository/folder/types.ts | 16 --- .../src/packages/core/repository/index.ts | 2 +- 18 files changed, 179 insertions(+), 254 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/folder/{data-type-folder.server.data-source.ts => data-type-folder.server.data.ts} (62%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/create.action.ts index 74cd00fb77..76f398b338 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/create.action.ts @@ -20,7 +20,7 @@ export class UmbCreateDataTypeEntityAction extends UmbEntityActionBase this.modalContext?.submit()); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/modal/index.ts index 85e124f71f..c6565fb240 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/modal/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/create/modal/index.ts @@ -1,7 +1,7 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbDataTypeCreateOptionsModalData { - parentId: string | null; + parentKey: string | null; } export const UMB_DATA_TYPE_CREATE_OPTIONS_MODAL = new UmbModalToken( @@ -9,5 +9,5 @@ export const UMB_DATA_TYPE_CREATE_OPTIONS_MODAL = new UmbModalToken { +export const createTreeItem = (item: CreateDataTypeRequestModel): FolderTreeItemResponseModel => { if (!item) throw new Error('item is null or undefined'); - if (!item.id) throw new Error('Id is null or undefined'); - if (item.parentId === undefined) throw new Error('ParentId is undefined'); + if (!item.id) throw new Error('item.id is null or undefined'); return { - id: item.id, + type: 'data-type', parentId: item.parentId, - type: DATA_TYPE_ENTITY_TYPE, name: item.name, + id: item.id, + isFolder: false, + isContainer: false, + hasChildren: false, }; }; -export const folderToDataTypeTreeItemMapper = (folder: UmbCreateFolderModel): FolderTreeItemResponseModel => { - if (!folder) throw new Error('Folder is required'); - if (!folder.unique) throw new Error('Folder unique required'); - if (folder.parentUnique === undefined) throw new Error('Folder parent unique is required'); +export const createFolderTreeItem = (item: CreateFolderRequestModel): FolderTreeItemResponseModel => { + if (!item) throw new Error('item is null or undefined'); + if (!item.id) throw new Error('item.id is null or undefined'); return { - id: folder.unique, - parentId: folder.parentUnique, - type: DATA_TYPE_ENTITY_TYPE, - name: folder.name, + ...createTreeItem(item), isFolder: true, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/folder/folder-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/folder/folder-modal.element.ts index 21f772f420..2396d7c86e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/folder/folder-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/folder/folder-modal.element.ts @@ -2,9 +2,9 @@ import { css, html, customElement, property, query, state } from '@umbraco-cms/b import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbFolderModalData, UmbFolderModalValue, UmbModalContext } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbFolderModel, UmbFolderRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbFolderRepository } from '@umbraco-cms/backoffice/repository'; import { createExtensionApi, ManifestBase } from '@umbraco-cms/backoffice/extension-api'; -import { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; +import { FolderResponseModel, ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -20,20 +20,20 @@ export class UmbFolderModalElement extends UmbLitElement { } public set data(value: UmbFolderModalData | undefined) { this._data = value; - this.#unique = value?.unique; + this.#unique = value?.unique || null; this.#parentUnique = value?.parentUnique || null; this.#repositoryAlias = value?.repositoryAlias; this.#observeRepository(); } #repositoryAlias?: string; - #unique?: string; + #unique: string | null = null; #parentUnique: string | null = null; #repository?: UmbFolderRepository; #repositoryObserver?: UmbObserverController; @state() - _folder?: UmbFolderModel; + _folder?: FolderResponseModel; @state() _headline?: string; @@ -112,18 +112,11 @@ export class UmbFolderModalElement extends UmbLitElement { this._folder = { ...this._folder, name: folderName }; if (this._isNew) { - const { error: createError } = await this.#repository.createFolder({ - unique: this._folder.unique, - parentUnique: this._folder.parentUnique, - name: folderName, - }); + const { error: createError } = await this.#repository.createFolder(this._folder); error = createError; } else { if (!this.#unique) throw new Error('Unique is required to update folder'); - const { error: updateError } = await this.#repository.updateFolder({ - unique: this._folder.unique, - name: folderName, - }); + const { error: updateError } = await this.#repository.updateFolder(this.#unique, this._folder); error = updateError; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/folder-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/folder-modal.token.ts index e3460259c2..a34075ff65 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/folder-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/folder-modal.token.ts @@ -4,7 +4,7 @@ import { FolderResponseModel } from '@umbraco-cms/backoffice/backend-api'; export interface UmbFolderModalData { repositoryAlias: string; unique?: string; - parentUnique: string | null; + parentUnique?: string | null; } export interface UmbFolderModalValue { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts new file mode 100644 index 0000000000..f96755e6a3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/folder-data-source.interface.ts @@ -0,0 +1,14 @@ +import { DataSourceResponse } from './data-source-response.interface.js'; +import { + CreateFolderRequestModel, + FolderResponseModel, + UpdateFolderResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export interface UmbFolderDataSource { + createScaffold(parentId: string | null): Promise>; + get(unique: string): Promise>; + insert(data: CreateFolderRequestModel): Promise>; + update(unique: string, data: CreateFolderRequestModel): Promise>; + delete(unique: string): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts index 4980a9bbe6..77227e517f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts @@ -4,5 +4,6 @@ export * from './data-source-response.interface.js'; export * from './data-source.interface.js'; export * from './extend-data-source-paged-response-data.function.js'; export * from './extend-data-source-response-data.function.js'; +export * from './folder-data-source.interface.js'; export * from './move-data-source.interface.js'; export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts new file mode 100644 index 0000000000..ddf9268ddc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder-repository.interface.ts @@ -0,0 +1,36 @@ +import type { + CreateFolderRequestModel, + FolderModelBaseModel, + FolderResponseModel, + ProblemDetails, + UpdateFolderResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export interface UmbFolderRepository extends UmbApi { + createFolderScaffold(parentId: string | null): Promise<{ + data?: FolderResponseModel; + error?: ProblemDetails; + }>; + createFolder(folderRequest: CreateFolderRequestModel): Promise<{ + data?: string; + error?: ProblemDetails; + }>; + + requestFolder(unique: string): Promise<{ + data?: FolderResponseModel; + error?: ProblemDetails; + }>; + + updateFolder( + unique: string, + folder: FolderModelBaseModel, + ): Promise<{ + data?: UpdateFolderResponseModel; + error?: ProblemDetails; + }>; + + deleteFolder(id: string): Promise<{ + error?: ProblemDetails; + }>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts deleted file mode 100644 index 01e03cf6be..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-data-source.interface.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { DataSourceResponse } from '../data-source/data-source-response.interface.js'; -import { UmbCreateFolderModel, UmbUpdateFolderModel } from './types.js'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { FolderResponseModel, UpdateFolderResponseModel } from '@umbraco-cms/backoffice/backend-api'; - -export interface UmbFolderDataSourceConstructor { - new (host: UmbControllerHost): UmbFolderDataSource; -} - -export interface UmbFolderDataSource { - get(unique: string): Promise>; - insert(args: UmbCreateFolderModel): Promise>; - update(args: UmbUpdateFolderModel): Promise>; - delete(unique: string): Promise; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts deleted file mode 100644 index 648d36d428..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository-base.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { UmbRepositoryBase } from '../repository-base.js'; -import { type UmbFolderRepository } from './folder-repository.interface.js'; -import type { UmbFolderDataSource, UmbFolderDataSourceConstructor } from './folder-data-source.interface.js'; -import { UmbCreateFolderModel, UmbUpdateFolderModel } from './types.js'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbTreeStore } from '@umbraco-cms/backoffice/tree'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbId } from '@umbraco-cms/backoffice/id'; - -export type UmbFolderToTreeItemMapper = (item: UmbCreateFolderModel) => FolderTreeItemType; - -export class UmbFolderRepositoryBase extends UmbRepositoryBase implements UmbFolderRepository { - protected _init: Promise; - protected _treeStore?: UmbTreeStore; - #folderDataSource: UmbFolderDataSource; - #folderToTreeItemMapper: UmbFolderToTreeItemMapper; - - constructor( - host: UmbControllerHost, - folderDataSource: UmbFolderDataSourceConstructor, - treeStoreContextAlias: string | UmbContextToken, - folderToTreeItemMapper: UmbFolderToTreeItemMapper, - ) { - super(host); - this.#folderDataSource = new folderDataSource(this); - this.#folderToTreeItemMapper = folderToTreeItemMapper; - - this._init = this.consumeContext(treeStoreContextAlias, (instance) => { - this._treeStore = instance as UmbTreeStore; - }).asPromise(); - } - - /** - * Creates a Data Type folder with the given id from the server - * @param {string} parentId - * @return {*} - * @memberof UmbDataTypeFolderServerDataSource - */ - /* TODO: revisit this method. - Id is currently not used everywhere, but the method is currently overwritten for file system repos. */ - async createFolderScaffold(parentUnique: string | null) { - if (parentUnique === undefined) throw new Error('Parent unique is missing'); - - const scaffold = { - name: '', - unique: UmbId.new(), - parentUnique, - }; - - return { data: scaffold }; - } - - async createFolder(args: UmbCreateFolderModel) { - if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); - if (!args.name) throw new Error('Name is missing'); - await this._init; - - const { error } = await this.#folderDataSource.insert(args); - - if (!error) { - const folderTreeItem = this.#folderToTreeItemMapper(args); - this._treeStore!.appendItems([folderTreeItem]); - } - - return { error }; - } - - async deleteFolder(id: string) { - if (!id) throw new Error('Key is missing'); - await this._init; - - const { error } = await this.#folderDataSource.delete(id); - - if (!error) { - this._treeStore!.removeItem(id); - } - - return { error }; - } - - /** - * Request a folder by a unique - * @param {string} id - * @param {FolderModelBaseModel} folder - * @return {*} - * @memberof UmbFolderRepositoryBase - */ - async updateFolder(args: UmbUpdateFolderModel) { - if (!args.unique) throw new Error('Unique is missing'); - if (!args.name) throw new Error('Folder name is missing'); - await this._init; - - const { error } = await this.#folderDataSource.update(args); - - if (!error) { - this._treeStore!.updateItem(args.unique, { name: args.name }); - } - - return { error }; - } - - /** - * Request a folder by a unique - * @param {string} unique - * @return {*} - * @memberof UmbFolderRepositoryBase - */ - async requestFolder(unique: string) { - if (!unique) throw new Error('Unique is missing'); - await this._init; - return await this.#folderDataSource.get(unique); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts deleted file mode 100644 index f1d21beaa8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/folder-repository.interface.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { UmbCreateFolderModel, UmbUpdateFolderModel } from './types.js'; -import type { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; - -// TODO add response types folder folders -export interface UmbFolderRepository extends UmbApi { - createFolderScaffold(unique: string | null): Promise<{ - data?: any; - error?: ProblemDetails; - }>; - createFolder(args: UmbCreateFolderModel): Promise<{ - data?: string; - error?: ProblemDetails; - }>; - - requestFolder(unique: string): Promise<{ - data?: any; - error?: ProblemDetails; - }>; - - updateFolder(args: UmbUpdateFolderModel): Promise<{ - data?: any; - error?: ProblemDetails; - }>; - - deleteFolder(unique: string): Promise<{ - error?: ProblemDetails; - }>; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/index.ts deleted file mode 100644 index b0d89c930c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { type UmbFolderRepository } from './folder-repository.interface.js'; -export { type UmbFolderDataSource } from './folder-data-source.interface.js'; -export { UmbFolderRepositoryBase } from './folder-repository-base.js'; -export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts deleted file mode 100644 index 3ca1e96872..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/folder/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface UmbFolderModel { - name: string; - unique: string; - parentUnique: string | null; -} - -export interface UmbCreateFolderModel { - unique?: string; - parentUnique: string | null; - name: string; -} - -export interface UmbUpdateFolderModel { - unique: string; - name: string; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts index 53662f5645..d39abba3d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts @@ -1,5 +1,6 @@ export * from './data-source/index.js'; export * from './detail-repository.interface.js'; +export * from './folder-repository.interface.js'; export * from './collection-repository.interface.js'; export * from './move-repository.interface.js'; export * from './copy-repository.interface.js'; @@ -7,4 +8,3 @@ export * from './repository-items.manager.js'; export * from './repository-base.js'; export * from './item/index.js'; -export * from './folder/index.js'; From 51ff770846f0379056ccef30f73f41381ee9f3a6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 Nov 2023 19:00:00 +0100 Subject: [PATCH 41/41] update parameter name --- .../src/packages/core/store/file-system-item.store.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts index 8c4705a707..c766960bbf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts @@ -21,11 +21,11 @@ export class UmbFileSystemItemStore /** * Return an observable to observe file system items - * @param {Array} ids + * @param {Array} paths * @return {*} * @memberof UmbFileSystemItemStore */ - items(ids: Array) { - return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.path ?? ''))); + items(paths: Array) { + return this._data.asObservablePart((items) => items.filter((item) => paths.includes(item.path ?? ''))); } }