From d21f0ff0f37baaa048c8bf93ff39c21f54e7fc27 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 11:13:42 +0200 Subject: [PATCH 01/54] always fetch server configuration --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 0050045e88..b06e0ae9cc 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -114,6 +114,10 @@ export class UmbAppElement extends UmbLitElement { // Try to initialise the auth flow and get the runtime status try { + if (this.bypassAuth === false) { + await this.#authFlow.fetchServiceConfiguration(); + } + // Get the current runtime level await this.#setInitStatus(); From 50a815c8be04697d702d92a2c8264152e66d42e9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 11:14:17 +0200 Subject: [PATCH 02/54] only fetch the server configuration if it hasn't been fetched before --- .../src/shared/auth/auth-flow.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts index 251bdea185..f93a592d6a 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts @@ -102,7 +102,7 @@ export class UmbAuthFlow { openIdConnectUrl: string, redirectUri: string, clientId = 'umbraco-back-office', - scope = 'offline_access' + scope = 'offline_access', ) { this.#openIdConnectUrl = openIdConnectUrl; this.#redirectUri = redirectUri; @@ -115,7 +115,7 @@ export class UmbAuthFlow { this.#authorizationHandler = new RedirectRequestHandler( this.#storageBackend, new UmbNoHashQueryStringUtils(), - window.location + window.location, ); // set notifier to deliver responses @@ -156,7 +156,10 @@ export class UmbAuthFlow { */ async setInitialState() { // Ensure there is a connection to the server - await this.fetchServiceConfiguration(); + if (!this.#configuration) { + await this.fetchServiceConfiguration(); + } + const tokenResponseJson = await this.#storageBackend.getItem(TOKEN_RESPONSE_NAME); if (tokenResponseJson) { const response = new TokenResponse(JSON.parse(tokenResponseJson)); @@ -216,7 +219,7 @@ export class UmbAuthFlow { extras: extras, }, undefined, - true + true, ); this.#authorizationHandler.performAuthorizationRequest(this.#configuration, request); From db4cfaa4330578d0621d5f8a34cf12f755b450a4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 13:15:40 +0200 Subject: [PATCH 03/54] feature:move-app-context-into-app --- .../src/{shared/context => apps/app}/app.context.ts | 0 src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 2 +- src/Umbraco.Web.UI.Client/src/apps/app/index.ts | 1 + .../modals/current-user/current-user-modal.element.ts | 4 ++-- src/Umbraco.Web.UI.Client/src/shared/context/index.ts | 1 - src/Umbraco.Web.UI.Client/tsconfig.json | 4 +++- src/Umbraco.Web.UI.Client/web-test-runner.config.mjs | 3 ++- 7 files changed, 9 insertions(+), 6 deletions(-) rename src/Umbraco.Web.UI.Client/src/{shared/context => apps/app}/app.context.ts (100%) delete mode 100644 src/Umbraco.Web.UI.Client/src/shared/context/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/context/app.context.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.context.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/shared/context/app.context.ts rename to src/Umbraco.Web.UI.Client/src/apps/app/app.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index b06e0ae9cc..43d28c0f01 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -1,7 +1,7 @@ import type { UmbAppErrorElement } from './app-error.element.js'; +import { UMB_APP, UmbAppContext } from './app.context.js'; import { umbLocalizationRegistry } from '@umbraco-cms/backoffice/localization'; import { UMB_AUTH, UmbAuthFlow, UmbAuthContext } from '@umbraco-cms/backoffice/auth'; -import { UMB_APP, UmbAppContext } from '@umbraco-cms/backoffice/context'; import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UUIIconRegistryEssential } from '@umbraco-cms/backoffice/external/uui'; import { UmbIconRegistry } from '@umbraco-cms/backoffice/icon'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/index.ts b/src/Umbraco.Web.UI.Client/src/apps/app/index.ts index 0834e3b2c8..fbe9620147 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/index.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/index.ts @@ -1,3 +1,4 @@ export * from './app-context-config.interface.js'; export * from './app-error.element.js'; export * from './app.element.js'; +export * from './app.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts index a337952acc..c3c5651e0f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts @@ -1,6 +1,6 @@ +import { UMB_APP } from '@umbraco-cms/backoffice/app'; import { UMB_AUTH, type UmbLoggedInUser } from '@umbraco-cms/backoffice/auth'; -import { UMB_APP } from '@umbraco-cms/backoffice/context'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, CSSResultGroup, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalContext } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/shared/context/index.ts b/src/Umbraco.Web.UI.Client/src/shared/context/index.ts deleted file mode 100644 index cbe999e3a3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/shared/context/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './app.context.js'; diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 3429b1c3a2..1d53fb8ce9 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -19,6 +19,9 @@ "baseUrl": ".", "incremental": true, "paths": { + // APPS + "@umbraco-cms/backoffice/app": ["src/apps/app"], + "@umbraco-cms/backoffice/external/lit": ["src/external/lit"], "@umbraco-cms/backoffice/external/lodash": ["src/external/lodash"], "@umbraco-cms/backoffice/external/monaco-editor": ["src/external/monaco-editor"], @@ -40,7 +43,6 @@ // SHARED "@umbraco-cms/backoffice/auth": ["src/shared/auth"], - "@umbraco-cms/backoffice/context": ["src/shared/context"], "@umbraco-cms/backoffice/events": ["src/shared/umb-events"], "@umbraco-cms/backoffice/icon": ["src/shared/icon-registry"], "@umbraco-cms/backoffice/models": ["src/shared/models"], diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs index 733e0bfa0e..7d40238f51 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -20,6 +20,8 @@ export default { imports: { 'src/': './src/', + '@umbraco-cms/backoffice/app': './src/apps/app/index.ts', + '@umbraco-cms/backoffice/external/lit': './src/external/lit/index.ts', '@umbraco-cms/backoffice/external/lodash': './src/external/lodash/index.ts', '@umbraco-cms/backoffice/external/monaco-editor': './src/external/monaco-editor/index.ts', @@ -40,7 +42,6 @@ export default { '@umbraco-cms/backoffice/observable-api': './src/libs/observable-api/index.ts', '@umbraco-cms/backoffice/auth': './src/shared/auth/index.ts', - '@umbraco-cms/backoffice/context': './src/shared/context/index.ts', '@umbraco-cms/backoffice/events': './src/shared/umb-events/index.ts', '@umbraco-cms/backoffice/icon': './src/shared/icon-registry/index.ts', '@umbraco-cms/backoffice/models': './src/shared/models/index.ts', From 4c313f08cc2b9c3e96e0c2147fe442dfa8ee3538 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Sat, 9 Sep 2023 18:13:38 +0200 Subject: [PATCH 04/54] Fix typo in backoffice --- src/Umbraco.Web.UI.Client/.github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/.github/README.md b/src/Umbraco.Web.UI.Client/.github/README.md index ddec9d6a4b..e8312c2d13 100644 --- a/src/Umbraco.Web.UI.Client/.github/README.md +++ b/src/Umbraco.Web.UI.Client/.github/README.md @@ -1,4 +1,4 @@ -# Umbraco.CMS.Bacoffice (Bellissima) +# Umbraco.CMS.Backoffice (Bellissima) This is the working repository of the upcoming new Backoffice to Umbraco CMS. From c3f045f4fe47b6b8b0fb26391659f17da0148274 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 8 Sep 2023 14:09:57 +0200 Subject: [PATCH 05/54] move health check to its own package --- .../src/apps/backoffice/backoffice.element.ts | 1 + .../dashboard-health-check.element.ts | 0 .../dashboard-health-check.stories.ts | 0 .../health-check-dashboard.context.ts | 0 .../health-check/health-check.context.ts | 0 .../src/packages/health-check/index.ts | 1 + .../src/packages/health-check/manifests.ts | 20 +++++++++++++++++++ .../packages/health-check/umbraco-package.ts | 9 +++++++++ .../views/health-check-action.element.ts | 0 ...health-check-group-box-overview.element.ts | 0 .../views/health-check-group.element.ts | 0 .../views/health-check-overview.element.ts | 0 .../packages/settings/dashboards/manifests.ts | 18 ----------------- 13 files changed, 31 insertions(+), 18 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/{settings/dashboards => }/health-check/dashboard-health-check.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings/dashboards => }/health-check/dashboard-health-check.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings/dashboards => }/health-check/health-check-dashboard.context.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings/dashboards => }/health-check/health-check.context.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/health-check/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/health-check/umbraco-package.ts rename src/Umbraco.Web.UI.Client/src/packages/{settings/dashboards => }/health-check/views/health-check-action.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings/dashboards => }/health-check/views/health-check-group-box-overview.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings/dashboards => }/health-check/views/health-check-group.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings/dashboards => }/health-check/views/health-check-overview.element.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts index e62fef759a..b4e71e88c8 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts @@ -25,6 +25,7 @@ const CORE_PACKAGES = [ import('../../packages/umbraco-news/umbraco-package.js'), import('../../packages/tags/umbraco-package.js'), import('../../packages/log-viewer/umbraco-package.js'), + import('../../packages/health-check/umbraco-package.js'), ]; @customElement('umb-backoffice') diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/dashboard-health-check.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/dashboard-health-check.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/dashboard-health-check.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/dashboard-health-check.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/health-check-dashboard.context.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check-dashboard.context.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/health-check-dashboard.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/health-check/health-check-dashboard.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/health-check.context.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/health-check.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/index.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/index.ts new file mode 100644 index 0000000000..1e95b5d703 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/index.ts @@ -0,0 +1 @@ +export * from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts new file mode 100644 index 0000000000..b4ecc50de9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts @@ -0,0 +1,20 @@ +export const manifests = [ + { + type: 'dashboard', + alias: 'Umb.Dashboard.HealthCheck', + name: 'Health Check', + elementName: 'umb-dashboard-health-check', + loader: () => import('./dashboard-health-check.element.js'), + weight: 102, + meta: { + label: 'Health Check', + pathname: 'health-check', + }, + conditions: [ + { + alias: 'Umb.Condition.SectionAlias', + match: 'Umb.Section.Settings', + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/umbraco-package.ts new file mode 100644 index 0000000000..3d26664c83 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/umbraco-package.ts @@ -0,0 +1,9 @@ +export const name = 'Umbraco.Core.HealthCheck'; +export const extensions = [ + { + name: 'Health Check Bundle', + alias: 'Umb.Bundle.HealthCheck', + type: 'bundle', + loader: () => import('./manifests.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/views/health-check-action.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-action.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/views/health-check-action.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-action.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/views/health-check-group-box-overview.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-group-box-overview.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/views/health-check-group-box-overview.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-group-box-overview.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/views/health-check-group.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-group.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/views/health-check-group.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-group.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/views/health-check-overview.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-overview.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/health-check/views/health-check-overview.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-overview.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/manifests.ts index a97e05e79d..d2313cc203 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/manifests.ts @@ -57,24 +57,6 @@ const dashboards: Array = [ }, ], }, - { - type: 'dashboard', - alias: 'Umb.Dashboard.HealthCheck', - name: 'Health Check', - elementName: 'umb-dashboard-health-check', - loader: () => import('./health-check/dashboard-health-check.element.js'), - weight: 102, - meta: { - label: 'Health Check', - pathname: 'health-check', - }, - conditions: [ - { - alias: 'Umb.Condition.SectionAlias', - match: sectionAlias, - }, - ], - }, { type: 'dashboard', alias: 'Umb.Dashboard.Profiling', From 72829c65da7aeb8b7c30fb1ac0aee7317f4059e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:28:15 +0000 Subject: [PATCH 06/54] Bump @playwright/test from 1.36.2 to 1.37.1 Bumps [@playwright/test](https://github.com/Microsoft/playwright) from 1.36.2 to 1.37.1. - [Release notes](https://github.com/Microsoft/playwright/releases) - [Commits](https://github.com/Microsoft/playwright/compare/v1.36.2...v1.37.1) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 16 ++++++++-------- src/Umbraco.Web.UI.Client/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index a22bc91367..27192e4090 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -26,7 +26,7 @@ "@babel/core": "^7.22.10", "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^3.2.0", - "@playwright/test": "^1.36.2", + "@playwright/test": "^1.37.1", "@rollup/plugin-commonjs": "^25.0.3", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.1.0", @@ -3409,13 +3409,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.2.tgz", - "integrity": "sha512-2rVZeyPRjxfPH6J0oGJqE8YxiM1IBRyM8hyrXYK7eSiAqmbNhxwcLa7dZ7fy9Kj26V7FYia5fh9XJRq4Dqme+g==", + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", + "integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.36.2" + "playwright-core": "1.37.1" }, "bin": { "playwright": "cli.js" @@ -3428,9 +3428,9 @@ } }, "node_modules/@playwright/test/node_modules/playwright-core": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.2.tgz", - "integrity": "sha512-sQYZt31dwkqxOrP7xy2ggDfEzUxM1lodjhsQ3NMMv5uGTRDsLxU0e4xf4wwMkF2gplIxf17QMBCodSFgm6bFVQ==", + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", + "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", "dev": true, "bin": { "playwright-core": "cli.js" diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index a701dd726c..db5f85f666 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -142,7 +142,7 @@ "@babel/core": "^7.22.10", "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^3.2.0", - "@playwright/test": "^1.36.2", + "@playwright/test": "^1.37.1", "@rollup/plugin-commonjs": "^25.0.3", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.1.0", From f50762138702540391df1d08d70b3c7fe59f0385 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 11 Sep 2023 09:35:42 +0200 Subject: [PATCH 07/54] fixing the overlay and disable issue --- .../dashboard-redirect-management.element.ts | 427 ++++++++---------- 1 file changed, 196 insertions(+), 231 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts index 17aa28afc2..7d1eeadb78 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts @@ -1,8 +1,4 @@ -import { - UUIButtonState, - UUIPaginationElement, - UUIPaginationEvent, -} from '@umbraco-cms/backoffice/external/uui'; +import { UUIButtonState, UUIPaginationElement, UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state, query, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalManagerContext, @@ -23,26 +19,26 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { @property({ type: Number, attribute: 'items-per-page' }) itemsPerPage = 20; + @property({ type: Number }) + page = 1; + + @state() + private _trackerEnabled = true; + + @state() + private _total = 0; + @state() private _redirectData?: RedirectUrlResponseModel[]; - @state() - private _trackerStatus = true; - - @state() - private _currentPage = 1; - - @state() - private _total?: number; - @state() private _buttonState: UUIButtonState; @state() private _filter?: string; - @query('#search-input') - private _searchField!: HTMLInputElement; + @query('#search') + private _search!: HTMLInputElement; @query('uui-pagination') private _pagination?: UUIPaginationElement; @@ -58,214 +54,214 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { connectedCallback() { super.connectedCallback(); - this._getTrackerStatus(); - this._getRedirectData(); + this.#getTrackerStatus(); + this.#getRedirectData(); } - private async _getTrackerStatus() { + async #getTrackerStatus() { const { data } = await tryExecuteAndNotify(this, RedirectManagementResource.getRedirectManagementStatus()); - if (data && data.status) this._trackerStatus = data.status === RedirectStatusModel.ENABLED ? true : false; + if (data && data.status) this._trackerEnabled = data.status === RedirectStatusModel.ENABLED ? true : false; } - private _removeRedirectHandler(data: RedirectUrlResponseModel) { + // Fetch data + async #getRedirectData(filter: string | undefined = undefined) { + const skip = this.page * this.itemsPerPage - this.itemsPerPage; + const { data } = await tryExecuteAndNotify( + this, + RedirectManagementResource.getRedirectManagement({ filter, take: this.itemsPerPage, skip }), + ); + if (!data) return; + + this._total = data?.total; + this._redirectData = data?.items; + + if (filter !== undefined) this._buttonState = 'success'; + } + + // Pagination + #onPageChange(event: UUIPaginationEvent) { + if (this.page === event.target.current) return; + this.page = event.target.current; + this.#getRedirectData(); + } + + // Delete Redirect Action + #onRequestDelete(data: RedirectUrlResponseModel) { + if (!data.id) return; const modalContext = this._modalContext?.open(UMB_CONFIRM_MODAL, { headline: 'Delete', content: html`
-

This will remove the redirect

- Original URL: ${data.originalUrl}
- Redirected To: ${data.destinationUrl} -

Are you sure you want to delete?

+

${this.localize.term('redirectUrls_redirectRemoveWarning')}

+ ${this.localize.term('redirectUrls_originalUrl')}: ${data.originalUrl}
+ ${this.localize.term('redirectUrls_redirectedTo')}: ${data.destinationUrl}
`, color: 'danger', confirmLabel: 'Delete', }); - modalContext?.onSubmit().then(() => { - this._removeRedirect(data); - }); + + modalContext + ?.onSubmit() + .then(() => { + this.#redirectDelete(data.id!); + }) + .catch(() => undefined); + } + async #redirectDelete(id: string) { + const { error } = await tryExecuteAndNotify(this, RedirectManagementResource.deleteRedirectManagementById({ id })); + if (error) return; + + this._redirectData = this._redirectData?.filter((x) => x.id !== id); } - private async _removeRedirect(r: RedirectUrlResponseModel) { - if (!r.id) return; - const res = await tryExecuteAndNotify(this, RedirectManagementResource.deleteRedirectManagementById({ id: r.id })); - if (!res.error) { - // or just run a this._getRedirectData() again? - //this.shadowRoot?.getElementById(`redirect-key-${r.id}`)?.remove(); - // No no, never manipulate DOM manipulate the data for the DOM: - this._redirectData = this._redirectData?.filter((x) => x.id !== r.id); + // Search action + #onKeypress(e: KeyboardEvent) { + if (e.key === 'Enter') this.#onSearch(); + } + #onSearch() { + this._buttonState = 'waiting'; + this._filter = this._search?.value ?? ''; + if (this._pagination) this._pagination.current = 1; + this.page = 1; + + this.#getRedirectData(this._search.value); + } + + // Tracker disable/enable + #onRequestTrackerToggle() { + if (!this._trackerEnabled) { + this.#trackerToggle(); + return; } - } - private _disableRedirectHandler() { const modalContext = this._modalContext?.open(UMB_CONFIRM_MODAL, { - headline: 'Disable URL tracker', - content: html`Are you sure you want to disable the URL tracker?`, + headline: `${this.localize.term('redirectUrls_disableUrlTracker')}`, + content: `${this.localize.term('redirectUrls_confirmDisable')}`, color: 'danger', confirmLabel: 'Disable', }); - modalContext?.onSubmit().then(() => { - this._toggleRedirect(); - }); + modalContext + ?.onSubmit() + .then(() => { + this.#trackerToggle(); + }) + .catch(() => undefined); } - private async _toggleRedirect() { + async #trackerToggle() { + const status = this._trackerEnabled ? RedirectStatusModel.DISABLED : RedirectStatusModel.ENABLED; const { error } = await tryExecuteAndNotify( this, - RedirectManagementResource.postRedirectManagementStatus({ status: RedirectStatusModel.ENABLED }) + RedirectManagementResource.postRedirectManagementStatus({ status }), ); - - if (!error) { - this._trackerStatus = !this._trackerStatus; - } - } - - private _inputHandler(pressed: KeyboardEvent) { - if (pressed.key === 'Enter') this._searchHandler(); - } - - private async _searchHandler() { - this._filter = this._searchField.value; - if (this._pagination) this._pagination.current = 1; - this._currentPage = 1; - if (this._filter.length) { - this._buttonState = 'waiting'; - } - this._getRedirectData(); - } - - private _onPageChange(event: UUIPaginationEvent) { - if (this._currentPage === event.target.current) return; - this._currentPage = event.target.current; - this._getRedirectData(); - } - - private async _getRedirectData() { - const skip = this._currentPage * this.itemsPerPage - this.itemsPerPage; - const { data } = await tryExecuteAndNotify( - this, - RedirectManagementResource.getRedirectManagement({ filter: this._filter, take: this.itemsPerPage, skip }) - ); - if (data) { - this._total = data?.total; - this._redirectData = data?.items; - if (this._filter?.length) { - this._buttonState = 'success'; - } - } + if (error) return; + this._trackerEnabled = !this._trackerEnabled; } + // Renders render() { - return html` - - + ${this._redirectData?.length + ? html` + ${this._trackerEnabled ? '' : html`
`} ${this.#renderTable()} +
` + : this._filter !== undefined + ? this.#renderZeroResults() + : this.#renderNoRedirects()} + ${this.#renderPagination()}`; } - private _renderZeroResults() { + #renderZeroResults() { return html` No redirects matching this search criteria

Double check your search for any error or spelling mistakes.

`; } - private renderNoRedirects() { + #renderNoRedirects() { return html` - No redirects have been made -

When a published page gets renamed or moved, a redirect will automatically be made to the new page.

+ ${this.localize.term('redirectUrls_noRedirects')} +

${this.localize.term('redirectUrls_noRedirectsDescription')}

`; } - private renderTable() { - // TODO: Instead of map, use repeat lit util: - return html` - - - Culture - Original URL - - Redirected To - Actions - - ${this._redirectData?.map((data) => { - return html` - ${data.culture || '*'} - - ${data.originalUrl} - - - - - - - ${data.destinationUrl} - - - - - - - - - - `; - })} - - - ${this._renderPagination()} - `; + #renderTable() { + return html` + + ${this.localize.term('redirectUrls_culture')} + ${this.localize.term('redirectUrls_originalUrl')} + + ${this.localize.term('redirectUrls_redirectedTo')} + ${this.localize.term('general_actions')} + + ${this.#renderTableData()} + `; } - private _renderPagination() { + #renderTableData() { + return html`${this._redirectData?.map((data) => { + return html` + ${data.culture || '*'} + + ${data.originalUrl} + + + + + + + ${data.destinationUrl} + + + + + this.#onRequestDelete(data)}> + + + + + `; + })}`; + } + + #renderPagination() { if (!this._total) return nothing; const totalPages = Math.ceil(this._total / this.itemsPerPage); @@ -273,7 +269,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { if (totalPages <= 1) return nothing; return html``; } @@ -281,74 +277,43 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { UmbTextStyles, css` :host { - display: block; - height: 100%; - } - - #header { display: flex; - gap: var(--uui-size-space-1); + flex-direction: column; + gap: var(--uui-size-4); + padding: var(--uui-size-layout-1); + } + + #redirect-actions { + display: flex; justify-content: space-between; - width: 100%; - padding: 0 var(--uui-size-layout-1); } - #header uui-icon { - transform: translateX(50%); + #search-wrapper { + display: flex; + gap: var(--uui-size-4); } - uui-table { - table-layout: fixed; + #redirect-wrapper { + position: relative; + display: block; + } + #redirect-wrapper #grey-out { + position: absolute; + inset: 0; + background-color: var(--uui-color-surface-alt); + opacity: 0.7; + z-index: 1; } - uui-table-head-cell:nth-child(2*n) { - width: 10%; - } - - uui-table-head-cell:last-child, - uui-table-cell:last-child { - text-align: right; - } - - uui-table uui-icon { - vertical-align: sub; - } uui-pagination { display: inline-block; } + .pagination { display: flex; justify-content: center; margin-top: var(--uui-size-space-5); } - - .trackerDisabled { - position: relative; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - } - .trackerDisabled::after { - content: ''; - background-color: var(--uui-color-disabled); - position: absolute; - border-radius: 2px; - left: 0; - right: 0; - top: 0; - bottom: 0; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - } - - a { - color: var(--uui-color-interactive); - } - a:hover, - a:focus { - color: var(--uui-color-interactive-emphasis); - } `, ]; } From b3d1e67dea5977b2ae042b454324f40c00107bda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:27:59 +0000 Subject: [PATCH 08/54] Bump @typescript-eslint/parser from 6.3.0 to 6.5.0 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.3.0 to 6.5.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.5.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 50 ++++++++++----------- src/Umbraco.Web.UI.Client/package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 27192e4090..18c9e78bb3 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -42,7 +42,7 @@ "@types/mocha": "^10.0.1", "@types/uuid": "^9.0.2", "@typescript-eslint/eslint-plugin": "^6.3.0", - "@typescript-eslint/parser": "^6.3.0", + "@typescript-eslint/parser": "^6.5.0", "@web/dev-server-esbuild": "^0.4.1", "@web/dev-server-import-maps": "^0.1.1", "@web/test-runner": "^0.17.0", @@ -7347,15 +7347,15 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", - "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.5.0.tgz", + "integrity": "sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.5.0", + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/typescript-estree": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0", "debug": "^4.3.4" }, "engines": { @@ -7375,13 +7375,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", - "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz", + "integrity": "sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0" + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -7392,9 +7392,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", - "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.5.0.tgz", + "integrity": "sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -7405,13 +7405,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", - "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz", + "integrity": "sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7432,12 +7432,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", - "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz", + "integrity": "sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/types": "6.5.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index db5f85f666..69e0720821 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -158,7 +158,7 @@ "@types/mocha": "^10.0.1", "@types/uuid": "^9.0.2", "@typescript-eslint/eslint-plugin": "^6.3.0", - "@typescript-eslint/parser": "^6.3.0", + "@typescript-eslint/parser": "^6.5.0", "@web/dev-server-esbuild": "^0.4.1", "@web/dev-server-import-maps": "^0.1.1", "@web/test-runner": "^0.17.0", From 61ac64f33cff73c0951bdbeeb9440a66ed0b088b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:27:22 +0000 Subject: [PATCH 09/54] Bump eslint-import-resolver-typescript from 3.5.5 to 3.6.0 Bumps [eslint-import-resolver-typescript](https://github.com/import-js/eslint-import-resolver-typescript) from 3.5.5 to 3.6.0. - [Release notes](https://github.com/import-js/eslint-import-resolver-typescript/releases) - [Changelog](https://github.com/import-js/eslint-import-resolver-typescript/blob/master/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-import-resolver-typescript/compare/v3.5.5...v3.6.0) --- updated-dependencies: - dependency-name: eslint-import-resolver-typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 319 +------------------- src/Umbraco.Web.UI.Client/package.json | 2 +- 2 files changed, 10 insertions(+), 311 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 18c9e78bb3..b583ffdaf0 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -50,7 +50,7 @@ "babel-loader": "^9.1.3", "eslint": "^8.46.0", "eslint-config-prettier": "^9.0.0", - "eslint-import-resolver-typescript": "^3.5.5", + "eslint-import-resolver-typescript": "^3.6.0", "eslint-plugin-import": "^2.28.0", "eslint-plugin-lit": "^1.8.3", "eslint-plugin-lit-a11y": "^4.1.0", @@ -3358,56 +3358,6 @@ "node": ">=14" } }, - "node_modules/@pkgr/utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.1.tgz", - "integrity": "sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.2.12", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pkgr/utils/node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@playwright/test": { "version": "1.37.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz", @@ -9994,21 +9944,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -10903,24 +10838,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/default-browser-id": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", @@ -10937,116 +10854,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-browser/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/default-browser/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -11751,19 +11558,18 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", + "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", "dev": true, "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" + "is-glob": "^4.0.3" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -11776,37 +11582,6 @@ "eslint-plugin-import": "*" } }, - "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", @@ -12461,9 +12236,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -14133,39 +13908,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -19067,21 +18809,6 @@ "integrity": "sha512-bH3g1/xOwbkuwE4iQ0tLwp1/r+dqttQr/ezO0tzp+KCttsCcxxgSCbEYy8+ePuSCLsiS3WhuTfFSED74d+tMjg==", "license": "MIT" }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -19928,22 +19655,6 @@ "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", "dev": true }, - "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dev": true, - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, "node_modules/table-layout": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", @@ -20242,18 +19953,6 @@ "tslib": "^2.0.3" } }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 69e0720821..42a00e150d 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -166,7 +166,7 @@ "babel-loader": "^9.1.3", "eslint": "^8.46.0", "eslint-config-prettier": "^9.0.0", - "eslint-import-resolver-typescript": "^3.5.5", + "eslint-import-resolver-typescript": "^3.6.0", "eslint-plugin-import": "^2.28.0", "eslint-plugin-lit": "^1.8.3", "eslint-plugin-lit-a11y": "^4.1.0", From e0cff0b959e7a464b51f8af47dfdea9780e857dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:27:39 +0000 Subject: [PATCH 10/54] Bump @babel/core from 7.22.10 to 7.22.11 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.22.10 to 7.22.11. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.22.11/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 50 ++++++++++----------- src/Umbraco.Web.UI.Client/package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index b583ffdaf0..ba9f0aadd3 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -23,7 +23,7 @@ "uuid": "^9.0.0" }, "devDependencies": { - "@babel/core": "^7.22.10", + "@babel/core": "^7.22.11", "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^3.2.0", "@playwright/test": "^1.37.1", @@ -194,9 +194,9 @@ } }, "node_modules/@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", + "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -204,15 +204,15 @@ "@babel/generator": "^7.22.10", "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { @@ -544,14 +544,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", + "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" }, "engines": { "node": ">=6.9.0" @@ -572,9 +572,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.22.14", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz", + "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2067,9 +2067,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", + "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.10", @@ -2078,8 +2078,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/parser": "^7.22.11", + "@babel/types": "^7.22.11", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2088,9 +2088,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", + "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 42a00e150d..e4272d6a77 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -139,7 +139,7 @@ "uuid": "^9.0.0" }, "devDependencies": { - "@babel/core": "^7.22.10", + "@babel/core": "^7.22.11", "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^3.2.0", "@playwright/test": "^1.37.1", From 567b5475ac8f6bc73bc3e0904730be253f5ee273 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 18:14:08 +0000 Subject: [PATCH 11/54] Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .../azure-static-web-apps-ambitious-stone-0033b3603.yml | 2 +- .../workflows/azure-static-web-apps-ashy-bay-09f36a803.yml | 2 +- src/Umbraco.Web.UI.Client/.github/workflows/build_test.yml | 2 +- src/Umbraco.Web.UI.Client/.github/workflows/codeql.yml | 2 +- .../.github/workflows/dependency-review.yml | 2 +- src/Umbraco.Web.UI.Client/.github/workflows/devskim.yml | 2 +- .../.github/workflows/npm-publish-github-packages.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/azure-static-web-apps-ambitious-stone-0033b3603.yml b/src/Umbraco.Web.UI.Client/.github/workflows/azure-static-web-apps-ambitious-stone-0033b3603.yml index 90bfa0eef8..4698973933 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/azure-static-web-apps-ambitious-stone-0033b3603.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/azure-static-web-apps-ambitious-stone-0033b3603.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest name: Build and Deploy Job steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - name: Build And Deploy diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/azure-static-web-apps-ashy-bay-09f36a803.yml b/src/Umbraco.Web.UI.Client/.github/workflows/azure-static-web-apps-ashy-bay-09f36a803.yml index a736a3e6dc..577a465c5b 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/azure-static-web-apps-ashy-bay-09f36a803.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/azure-static-web-apps-ashy-bay-09f36a803.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest name: Build and Deploy Job steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - name: Build And Deploy diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/build_test.yml b/src/Umbraco.Web.UI.Client/.github/workflows/build_test.yml index 66dba67bc5..d757664d6c 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/build_test.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/build_test.yml @@ -28,7 +28,7 @@ jobs: node-version: [18.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/codeql.yml b/src/Umbraco.Web.UI.Client/.github/workflows/codeql.yml index 796d548755..88da8bd514 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/codeql.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/codeql.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/dependency-review.yml b/src/Umbraco.Web.UI.Client/.github/workflows/dependency-review.yml index b0dedc42e0..4e75197790 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/dependency-review.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/dependency-review.yml @@ -15,6 +15,6 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'Dependency Review' uses: actions/dependency-review-action@v3 diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/devskim.yml b/src/Umbraco.Web.UI.Client/.github/workflows/devskim.yml index 28ce6e06eb..9e564ac12f 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/devskim.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/devskim.yml @@ -21,7 +21,7 @@ jobs: security-events: write steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Run DevSkim scanner uses: microsoft/DevSkim-Action@v1 diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/npm-publish-github-packages.yml b/src/Umbraco.Web.UI.Client/.github/workflows/npm-publish-github-packages.yml index 77f8e0791f..d4a94d9fc0 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/npm-publish-github-packages.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/npm-publish-github-packages.yml @@ -28,7 +28,7 @@ jobs: group: npm-publish cancel-in-progress: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: node-version: 18 From 47fbfe62e3474df02a40b79e2add5597a89effdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 6 Sep 2023 19:50:14 +0200 Subject: [PATCH 12/54] a good first version of very by culture toggle for property editor settings --- ...nt-type-property-structure-helper.class.ts | 2 +- .../property-settings-modal.element.ts | 45 +++++++++++++++++-- .../token/property-settings-modal.token.ts | 5 ++- .../documents/document-types/index.ts | 2 + .../repository/document-type.store.ts | 2 +- .../document-types/repository/index.ts | 3 ++ ...-workspace-view-edit-properties.element.ts | 11 ++++- ...pe-workspace-view-edit-property.element.ts | 6 ++- 8 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-property-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-property-structure-helper.class.ts index b7f19d1d10..3de8a340b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-property-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-property-structure-helper.class.ts @@ -29,7 +29,7 @@ export class UmbContentTypePropertyStructureHelper { this.#propertyStructure.sortBy((a, b) => ((a as any).sortOrder ?? 0) - ((b as any).sortOrder ?? 0)); } - public getOwnerDocumentTypes() { + get ownerDocumentTypes() { return this.#structure?.documentTypes; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/property-settings/property-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/property-settings/property-settings-modal.element.ts index 549f5d301f..c7603d99f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/property-settings/property-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/property-settings/property-settings-modal.element.ts @@ -8,6 +8,7 @@ import { PropertyValueMap, css, html, nothing, customElement, state } from '@umb import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; import { UmbPropertySettingsModalResult, UmbPropertySettingsModalData } from '@umbraco-cms/backoffice/modal'; import { generateAlias } from '@umbraco-cms/backoffice/utils'; +import { UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/document-type'; // TODO: Could base take a token to get its types?. // TODO: Missing a workspace context... unless this should not be a workspace any way. @customElement('umb-property-settings-modal') @@ -43,12 +44,24 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement< @state() private _aliasLocked = true; + @state() + protected _ownerDocumentType?: UmbPropertySettingsModalResult; + @state() protected _returnData!: UmbPropertySettingsModalResult; connectedCallback(): void { super.connectedCallback(); - this._returnData = JSON.parse(JSON.stringify(this.data)); + + // TODO: This is actually not good enough, we need to be able to get to the DOCUMENT_WORKSPACE_CONTEXT, so we can have a look at the draft/runtime version of the document. Otherwise 'Vary by culture' is first updated when saved. + this.consumeContext(UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN, (instance) => { + this.observe(instance.byId(this.data?.documentTypeId), (documentType) => { + this._ownerDocumentType = documentType; + this.requestUpdate('_ownerDocumentType'); + }, '_observeDocumentType'); + }); + + this._returnData = JSON.parse(JSON.stringify(this.data?.propertyData ?? {})); this._returnData.validation ??= {}; @@ -105,7 +118,7 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement< if (!this._aliasLocked) { this._returnData.alias = alias; } else { - this._returnData.alias = this.data?.alias; + this._returnData.alias = this.data?.propertyData?.alias; } this.requestUpdate('_returnData'); } @@ -177,6 +190,11 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement< this.requestUpdate('_returnData'); } + #onVaryByCultureChange(event: UUIBooleanInputEvent) { + this._returnData.variesByCulture = event.target.checked; + this.requestUpdate('_returnData'); + } + // TODO: This would conceptually be a Property Editor Workspace, should be changed at one point in the future. // For now this is hacky made available by giving the element an fixed alias. // This would allow for workspace views and workspace actions. @@ -226,6 +244,7 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement< ${this.#renderCustomValidation()}
+ ${this.#renderVariationControls()}
Appearance
${this.#renderAlignLeftIcon()} ${this.#renderAlignTopIcon()}
@@ -277,13 +296,13 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement<
${this._returnData.validation?.mandatory ? html` + Variation + ${this._ownerDocumentType?.variesByCulture ? this.#renderVaryByCulture() : ''} + +
` + : ''; + } + #renderVaryByCulture() { + return html` + `; + } + static styles = [ UmbTextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/property-settings-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/property-settings-modal.token.ts index 9681fb5edc..e19b23161f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/property-settings-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/property-settings-modal.token.ts @@ -1,7 +1,10 @@ import { PropertyTypeModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -export type UmbPropertySettingsModalData = PropertyTypeModelBaseModel; +export type UmbPropertySettingsModalData = { + documentTypeId: string; + propertyData: PropertyTypeModelBaseModel +}; export type UmbPropertySettingsModalResult = PropertyTypeModelBaseModel; export const UMB_PROPERTY_SETTINGS_MODAL = new UmbModalToken< diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/index.ts index bc8d60f4ec..875da8e50e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/index.ts @@ -1,5 +1,7 @@ import './components/index.js'; +export * from './repository/index.js'; + export const DOCUMENT_TYPE_ROOT_ENTITY_TYPE = 'document-type-root'; export const DOCUMENT_TYPE_ENTITY_TYPE = 'document-type'; export const DOCUMENT_TYPE_FOLDER_ENTITY_TYPE = 'document-type-folder'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.store.ts index 478934315a..5e9abda97d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.store.ts @@ -10,7 +10,7 @@ import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api * @extends {UmbStoreBase} * @description - Data Store for Document Types */ -export class UmbDocumentTypeStore extends UmbStoreBase { +export class UmbDocumentTypeStore extends UmbStoreBase { /** * Creates an instance of UmbDocumentTypeStore. * @param {UmbControllerHostElement} host diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/index.ts new file mode 100644 index 0000000000..bac7074196 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/index.ts @@ -0,0 +1,3 @@ +export * from './document-type.repository.js' +export * from './document-type.store.js' +export * from './document-type.tree.store.js' diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts index 49c68bca7e..2d77e819c7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts @@ -104,7 +104,14 @@ export class UmbDocumentTypeWorkspaceViewEditPropertiesElement extends UmbLitEle new UmbModalRouteRegistrationController(this, UMB_PROPERTY_SETTINGS_MODAL) .addAdditionalPath('new-property') .onSetup(async () => { - return (await this._propertyStructureHelper.createPropertyScaffold(this._containerId)) ?? false; + + const documentTypeId = this._ownerDocumentTypes?.find( + (types) => types.containers?.find((containers) => containers.id === this.containerId), + )?.id; + if(documentTypeId === undefined) return false; + const propertyData = await this._propertyStructureHelper.createPropertyScaffold(this._containerId); + if(propertyData === undefined) return false; + return {propertyData, documentTypeId}; }) .onSubmit((result) => { this.#addProperty(result); @@ -116,7 +123,7 @@ export class UmbDocumentTypeWorkspaceViewEditPropertiesElement extends UmbLitEle connectedCallback(): void { super.connectedCallback(); - const doctypes = this._propertyStructureHelper.getOwnerDocumentTypes(); + const doctypes = this._propertyStructureHelper.ownerDocumentTypes; if (!doctypes) return; this.observe( doctypes, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-property.element.ts index abe4098cc3..a980b612f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit-property.element.ts @@ -86,7 +86,11 @@ export class UmbDocumentTypeWorkspacePropertyElement extends UmbLitElement { this.#modalRegistration = new UmbModalRouteRegistrationController(this, UMB_PROPERTY_SETTINGS_MODAL) .addUniquePaths(['propertyId']) .onSetup(() => { - return this.property ?? false; + const documentTypeId = this.ownerDocumentTypeId; + if(documentTypeId === undefined) return false; + const propertyData = this.property; + if(propertyData === undefined) return false; + return {propertyData, documentTypeId}; }) .onSubmit((result) => { this._partialUpdate(result); From 1c064bab5f7560f44033e9109b0e5949fab084c4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 14:06:21 +0200 Subject: [PATCH 13/54] format --- .../workspace/document-type-workspace.context.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index 4cc9b70c01..fd805c2f97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -156,9 +156,10 @@ export class UmbDocumentTypeWorkspaceContext } } - -export const UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT = new UmbContextToken< + UmbSaveableWorkspaceContextInterface, + UmbDocumentTypeWorkspaceContext +>( 'UmbWorkspaceContext', - (context): context is UmbDocumentTypeWorkspaceContext => context.getEntityType?.() === 'document-type' + (context): context is UmbDocumentTypeWorkspaceContext => context.getEntityType?.() === 'document-type', ); - From 368149b0ce96f748ef2181bbede713aaae50da8b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 14:06:45 +0200 Subject: [PATCH 14/54] format --- .../content-type-structure-manager.class.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index 9801557be4..9843325613 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -314,28 +314,24 @@ export class UmbContentTypePropertyStructureManager { for (const docType of docTypes) { const foundProp = docType.properties?.find((property) => property.id === propertyId); - if(foundProp) { + if (foundProp) { return foundProp; } } return undefined; }); } - async propertyStructureByAlias( - propertyAlias: string - ) { + async propertyStructureByAlias(propertyAlias: string) { await this.#init; return this.#documentTypes.asObservablePart((docTypes) => { for (const docType of docTypes) { const foundProp = docType.properties?.find((property) => property.alias === propertyAlias); - if(foundProp) { + if (foundProp) { return foundProp; } } @@ -347,7 +343,7 @@ export class UmbContentTypePropertyStructureManager property.id === propertyId); - if(foundProp) { + if (foundProp) { return foundProp; } } @@ -357,14 +353,13 @@ export class UmbContentTypePropertyStructureManager property.alias === propertyAlias); - if(foundProp) { + if (foundProp) { return foundProp; } } return undefined; } - /* rootDocumentTypeName() { return this.#documentTypes.asObservablePart((docTypes) => { From 3e31926dfdfcedc3faa1e8219e740ca21375cca8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 14:07:29 +0200 Subject: [PATCH 15/54] we can now trust the ids --- .../sources/document-type.server.data.ts | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type.server.data.ts index 492fb7fec9..d330b957cb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type.server.data.ts @@ -45,7 +45,7 @@ export class UmbDocumentTypeServerDataSource this.#host, DocumentTypeResource.getDocumentTypeById({ id: id, - }) + }), ); } @@ -91,27 +91,12 @@ export class UmbDocumentTypeServerDataSource * @memberof UmbDocumentTypeServerDataSource */ async insert(documentType: CreateDocumentTypeRequestModel) { - if (!documentType) throw new Error('Document is missing'); - //if (!document.id) throw new Error('ID is missing'); - - documentType = { ...documentType }; - - // TODO: Hack to remove some props that ruins the document-type post end-point. - (documentType as any).id = undefined; - - // TODO: Investigate if this matters (should go away anyway when we have the end-point accepts us defining the ids.) - documentType.properties = documentType.properties?.map((prop) => { - return { - ...prop, - id: undefined, - }; - }); - + if (!documentType) throw new Error('Document Type is missing'); return tryExecuteAndNotify( this.#host, DocumentTypeResource.postDocumentType({ requestBody: documentType, - }) + }), ); } @@ -164,7 +149,7 @@ export class UmbDocumentTypeServerDataSource headers: { 'Content-Type': 'application/json', }, - }).then((res) => res.json()) + }).then((res) => res.json()), ); } } From 3a1b1185a20291684dfead13799d2fd3327c855e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 14:10:07 +0200 Subject: [PATCH 16/54] remove the temp hack - we can now trust the ids --- .../repository/document-type.repository.ts | 32 ++++--------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts index 52234e5c7f..53145923ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts @@ -168,35 +168,15 @@ export class UmbDocumentTypeRepository // Could potentially be general methods: async create(documentType: ItemType) { - if (!documentType || !documentType.id) throw new Error('Template is missing'); + if (!documentType || !documentType.id) throw new Error('Document Type is missing'); await this.#init; - const { error, data } = await this.#detailDataSource.insert(documentType); + const { error } = await this.#detailDataSource.insert(documentType); - if (!error && data) { - // TODO: The parts here is a hack, when we can trust the IDs we send, then this should be removed/changed: - - const splitResultUrl = data.split('/'); - const newId = splitResultUrl[splitResultUrl.length - 1]; - - // Temporary hack while we are not in control of IDs: - - const newDocument = { ...(await this.requestById(newId)).data }; - - if (newDocument) { - const notification = { data: { message: `Document Type created` } }; - this.#notificationContext?.peek('positive', notification); - - await this.requestRootTreeItems(); - - // TODO: currently we cannot put this data into our store, cause we don't have the right ID, as the server currently changes it (and other ids of it, container-id and property-id) - //this.#detailStore?.append(newDocument); - - //const treeItem = createTreeItem(newDocument); - //this.#treeStore?.appendItems([treeItem]); - - return { data: newDocument }; - } + if (!error) { + this.#detailStore?.append(documentType); + const treeItem = createTreeItem(documentType); + this.#treeStore?.appendItems([treeItem]); } return { error }; From 0e8cf574cd31f4e2d1224b4e0ad75d2df4eafe65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 12:00:32 +0000 Subject: [PATCH 17/54] Bump @babel/core from 7.22.11 to 7.22.17 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.22.11 to 7.22.17. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.22.17/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 138 ++++++++++---------- src/Umbraco.Web.UI.Client/package.json | 2 +- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index ba9f0aadd3..a730a5ba69 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -23,7 +23,7 @@ "uuid": "^9.0.0" }, "devDependencies": { - "@babel/core": "^7.22.11", + "@babel/core": "^7.22.17", "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^3.2.0", "@playwright/test": "^1.37.1", @@ -172,12 +172,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -194,21 +194,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -224,12 +224,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.22.15", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -263,13 +263,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -381,28 +381,28 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -512,18 +512,18 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -544,23 +544,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", @@ -572,9 +572,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.14", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz", - "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2053,33 +2053,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", - "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2088,13 +2088,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.15", "to-fast-properties": "^2.0.0" }, "engines": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index e4272d6a77..6b942f77f0 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -139,7 +139,7 @@ "uuid": "^9.0.0" }, "devDependencies": { - "@babel/core": "^7.22.11", + "@babel/core": "^7.22.17", "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^3.2.0", "@playwright/test": "^1.37.1", From b0e3c3d6327f2ffefad41a2380ca497b2ee829f2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 14:30:23 +0200 Subject: [PATCH 18/54] rename to content type --- ...t-type-container-structure-helper.class.ts | 14 +- ...nt-type-property-structure-helper.class.ts | 2 +- .../content-type-structure-manager.class.ts | 186 ++++++++---------- .../document-type-workspace.context.ts | 54 ++--- ...cument-type-workspace-view-edit.element.ts | 12 +- 5 files changed, 125 insertions(+), 143 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-container-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-container-structure-helper.class.ts index 982f0d96a8..230b5b4f80 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-container-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-container-structure-helper.class.ts @@ -22,7 +22,7 @@ export class UmbContentTypeContainerStructureHelper { // Containers defined in data might be more than actual containers to display as we merge them by name. // Direct containers are the containers defining the total of this container(Multiple containers with the same name and type) private _ownerAlikeContainers: PropertyTypeContainerModelBaseModel[] = []; - // Owner containers are containers owned by the owner Document Type (The specific one up for editing) + // Owner containers are containers owned by the owner Content Type (The specific one up for editing) private _ownerContainers: PropertyTypeContainerModelBaseModel[] = []; // State containing the merged containers (only one pr. name): @@ -106,7 +106,7 @@ export class UmbContentTypeContainerStructureHelper { (ownerContainers) => { this._ownerContainers = ownerContainers || []; }, - '_observeOwnerContainers' + '_observeOwnerContainers', ); } else if (this._ownerName) { new UmbObserverController( @@ -121,7 +121,7 @@ export class UmbContentTypeContainerStructureHelper { this._observeChildContainers(); } }, - '_observeOwnerContainers' + '_observeOwnerContainers', ); } } @@ -136,7 +136,7 @@ export class UmbContentTypeContainerStructureHelper { (hasProperties) => { this.#hasProperties.next(hasProperties); }, - '_observeOwnerHasProperties_' + container.id + '_observeOwnerHasProperties_' + container.id, ); }); } @@ -149,7 +149,7 @@ export class UmbContentTypeContainerStructureHelper { this.#host, this.#structure!.containersOfParentKey(container.id, this._childType!), this._insertGroupContainers, - '_observeGroupsOf_' + container.id + '_observeGroupsOf_' + container.id, ); }); } @@ -164,7 +164,7 @@ export class UmbContentTypeContainerStructureHelper { this.#containers.next([]); this._insertGroupContainers(rootContainers); }, - '_observeRootContainers' + '_observeRootContainers', ); } @@ -223,7 +223,7 @@ export class UmbContentTypeContainerStructureHelper { if (!this.#structure) return; const newName = - this.#structure.makeContainerNameUniqueForOwnerDocument(name, this._childType, containerParentId) ?? name; + this.#structure.makeContainerNameUniqueForOwnerContentType(name, this._childType, containerParentId) ?? name; return await this.partialUpdateContainer(containerId, { name: newName }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-property-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-property-structure-helper.class.ts index 3de8a340b6..0f655193cc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-property-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-property-structure-helper.class.ts @@ -30,7 +30,7 @@ export class UmbContentTypePropertyStructureHelper { } get ownerDocumentTypes() { - return this.#structure?.documentTypes; + return this.#structure?.contentTypes; } public setStructureManager(structure: UmbContentTypePropertyStructureManager) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index 9843325613..f0be7b3295 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -28,11 +28,11 @@ export class UmbContentTypePropertyStructureManager(); - #documentTypes = new UmbArrayState([], (x) => x.id); - readonly documentTypes = this.#documentTypes.asObservable(); - private readonly _documentTypeContainers = this.#documentTypes.asObservablePart((x) => + #ownerContentTypeId?: string; + #contentTypeObservers = new Array(); + #contentTypes = new UmbArrayState([], (x) => x.id); + readonly contentTypes = this.#contentTypes.asObservable(); + private readonly _contentTypeContainers = this.#contentTypes.asObservablePart((x) => x.flatMap((x) => x.containers ?? []), ); @@ -43,13 +43,13 @@ export class UmbContentTypePropertyStructureManager { - documentTypes.forEach((documentType) => { - this._loadDocumentTypeCompositions(documentType); + new UmbObserverController(host, this.contentTypes, (contentTypes) => { + contentTypes.forEach((contentType) => { + this._loadContentTypeCompositions(contentType); }); }); - new UmbObserverController(host, this._documentTypeContainers, (documentTypeContainers) => { - this.#containers.next(documentTypeContainers); + new UmbObserverController(host, this._contentTypeContainers, (contentTypeContainers) => { + this.#containers.next(contentTypeContainers); }); } @@ -60,7 +60,7 @@ export class UmbContentTypePropertyStructureManager x.id === id)) return; + if (this.#contentTypes.getValue().find((x) => x.id === id)) return; await this._loadType(id); } @@ -118,53 +116,47 @@ export class UmbContentTypePropertyStructureManager { if (docType) { // TODO: Handle if there was changes made to the owner document type in this context. /* possible easy solutions could be to notify user wether they want to update(Discard the changes to accept the new ones). */ - this.#documentTypes.appendOne(docType); + this.#contentTypes.appendOne(docType); } }), ); } - private async _loadDocumentTypeCompositions(documentType: T) { - documentType.compositions?.forEach((composition) => { + private async _loadContentTypeCompositions(contentType: T) { + contentType.compositions?.forEach((composition) => { this._ensureType(composition.id); }); } - /* - private async _initDocumentTypeContainers(documentType: T) { - documentType.containers?.forEach((container) => { - this.#containers.appendOne({ ...container, _ownerDocumentTypeKey: documentType.id }); - }); - } - */ - /** Public methods for consuming structure: */ - ownerDocumentType() { - return this.#documentTypes.asObservablePart((x) => x.find((y) => y.id === this.#ownerDocumentTypeId)); + ownerContentType() { + return this.#contentTypes.asObservablePart((x) => x.find((y) => y.id === this.#ownerContentTypeId)); } - getOwnerDocumentType() { - return this.#documentTypes.getValue().find((y) => y.id === this.#ownerDocumentTypeId); + + getOwnerContentType() { + return this.#contentTypes.getValue().find((y) => y.id === this.#ownerContentTypeId); } - updateOwnerDocumentType(entry: T) { - this.#documentTypes.updateOne(this.#ownerDocumentTypeId, entry); + + updateOwnerContentType(entry: T) { + this.#contentTypes.updateOne(this.#ownerContentTypeId, entry); } // We could move the actions to another class? @@ -176,7 +168,7 @@ export class UmbContentTypePropertyStructureManager x.id === contentTypeId)?.containers ?? [])]; + const containers = [...(this.#contentTypes.getValue().find((x) => x.id === contentTypeId)?.containers ?? [])]; containers.push(container); - this.#documentTypes.updateOne(contentTypeId, { containers }); + this.#contentTypes.updateOne(contentTypeId, { containers }); return container; } - makeContainerNameUniqueForOwnerDocument( + makeContainerNameUniqueForOwnerContentType( newName: string, containerType: PropertyContainerTypes = 'Tab', parentId: string | null = null, @@ -213,28 +205,28 @@ export class UmbContentTypePropertyStructureManager, ) { await this.#init; - documentTypeId = documentTypeId ?? this.#ownerDocumentTypeId!; + contentTypeId = contentTypeId ?? this.#ownerContentTypeId!; - const frozenContainers = this.#documentTypes.getValue().find((x) => x.id === documentTypeId)?.containers ?? []; + const frozenContainers = this.#contentTypes.getValue().find((x) => x.id === contentTypeId)?.containers ?? []; const containers = partialUpdateFrozenArray(frozenContainers, partialUpdate, (x) => x.id === containerId); - this.#documentTypes.updateOne(documentTypeId, { containers }); + this.#contentTypes.updateOne(contentTypeId, { containers }); } - async removeContainer(documentTypeKey: string | null, containerId: string | null = null) { + async removeContainer(contentTypeId: string | null, containerId: string | null = null) { await this.#init; - documentTypeKey = documentTypeKey ?? this.#ownerDocumentTypeId!; + contentTypeId = contentTypeId ?? this.#ownerContentTypeId!; - const frozenContainers = this.#documentTypes.getValue().find((x) => x.id === documentTypeKey)?.containers ?? []; + const frozenContainers = this.#contentTypes.getValue().find((x) => x.id === contentTypeId)?.containers ?? []; const containers = frozenContainers.filter((x) => x.id !== containerId); - this.#documentTypes.updateOne(documentTypeKey, { containers }); + this.#contentTypes.updateOne(contentTypeId, { containers }); } createPropertyScaffold(containerId: string | null = null, sortOrder?: number) { @@ -262,61 +254,61 @@ export class UmbContentTypePropertyStructureManager x.id === documentTypeId)?.properties ?? [])]; + const properties = [...(this.#contentTypes.getValue().find((x) => x.id === contentTypeId)?.properties ?? [])]; properties.push(property); - this.#documentTypes.updateOne(documentTypeId, { properties }); + this.#contentTypes.updateOne(contentTypeId, { properties }); return property; } - async insertProperty(documentTypeId: string | null, property: PropertyTypeModelBaseModel) { + async insertProperty(contentTypeId: string | null, property: PropertyTypeModelBaseModel) { await this.#init; - documentTypeId = documentTypeId ?? this.#ownerDocumentTypeId!; + contentTypeId = contentTypeId ?? this.#ownerContentTypeId!; - const frozenProperties = this.#documentTypes.getValue().find((x) => x.id === documentTypeId)?.properties ?? []; + const frozenProperties = this.#contentTypes.getValue().find((x) => x.id === contentTypeId)?.properties ?? []; const properties = appendToFrozenArray(frozenProperties, property, (x) => x.id === property.id); - this.#documentTypes.updateOne(documentTypeId, { properties }); + this.#contentTypes.updateOne(contentTypeId, { properties }); } - async removeProperty(documentTypeId: string | null, propertyId: string) { + async removeProperty(contentTypeId: string | null, propertyId: string) { await this.#init; - documentTypeId = documentTypeId ?? this.#ownerDocumentTypeId!; + contentTypeId = contentTypeId ?? this.#ownerContentTypeId!; - const frozenProperties = this.#documentTypes.getValue().find((x) => x.id === documentTypeId)?.properties ?? []; + const frozenProperties = this.#contentTypes.getValue().find((x) => x.id === contentTypeId)?.properties ?? []; const properties = filterFrozenArray(frozenProperties, (x) => x.id !== propertyId); - this.#documentTypes.updateOne(documentTypeId, { properties }); + this.#contentTypes.updateOne(contentTypeId, { properties }); } async updateProperty( - documentTypeId: string | null, + contentTypeId: string | null, propertyId: string, partialUpdate: Partial, ) { await this.#init; - documentTypeId = documentTypeId ?? this.#ownerDocumentTypeId!; + contentTypeId = contentTypeId ?? this.#ownerContentTypeId!; - const frozenProperties = this.#documentTypes.getValue().find((x) => x.id === documentTypeId)?.properties ?? []; + const frozenProperties = this.#contentTypes.getValue().find((x) => x.id === contentTypeId)?.properties ?? []; const properties = partialUpdateFrozenArray(frozenProperties, partialUpdate, (x) => x.id === propertyId); - this.#documentTypes.updateOne(documentTypeId, { properties }); + this.#contentTypes.updateOne(contentTypeId, { properties }); } // TODO: Refactor: These property methods, should maybe be named without structure in their name. async propertyStructureById(propertyId: string) { await this.#init; - return this.#documentTypes.asObservablePart((docTypes) => { + return this.#contentTypes.asObservablePart((docTypes) => { for (const docType of docTypes) { const foundProp = docType.properties?.find((property) => property.id === propertyId); if (foundProp) { @@ -328,7 +320,7 @@ export class UmbContentTypePropertyStructureManager { + return this.#contentTypes.asObservablePart((docTypes) => { for (const docType of docTypes) { const foundProp = docType.properties?.find((property) => property.alias === propertyAlias); if (foundProp) { @@ -341,7 +333,7 @@ export class UmbContentTypePropertyStructureManager property.id === propertyId); if (foundProp) { return foundProp; @@ -349,9 +341,10 @@ export class UmbContentTypePropertyStructureManager property.alias === propertyAlias); if (foundProp) { return foundProp; @@ -360,32 +353,15 @@ export class UmbContentTypePropertyStructureManager { - const docType = docTypes.find((x) => x.id === this.#rootDocumentTypeKey); - return docType?.name ?? ''; - }); - } - */ - - ownerDocumentTypeObservablePart(mappingFunction: MappingFunction) { - return this.#documentTypes.asObservablePart((docTypes) => { - const docType = docTypes.find((x) => x.id === this.#ownerDocumentTypeId); + ownerContentTypeObservablePart(mappingFunction: MappingFunction) { + return this.#contentTypes.asObservablePart((docTypes) => { + const docType = docTypes.find((x) => x.id === this.#ownerContentTypeId); return docType ? mappingFunction(docType) : undefined; }); } - /* - nameOfDocumentType(id: string) { - return this.#documentTypes.asObservablePart((docTypes) => { - const docType = docTypes.find((x) => x.id === id); - return docType?.name ?? ''; - }); - } - */ hasPropertyStructuresOf(containerId: string | null) { - return this.#documentTypes.asObservablePart((docTypes) => { + return this.#contentTypes.asObservablePart((docTypes) => { return ( docTypes.find((docType) => { return docType.properties?.find((property) => property.containerId === containerId); @@ -393,11 +369,13 @@ export class UmbContentTypePropertyStructureManager { + return this.#contentTypes.asObservablePart((docTypes) => { const props: DocumentTypePropertyTypeResponseModel[] = []; docTypes.forEach((docType) => { docType.properties?.forEach((property) => { @@ -427,15 +405,15 @@ export class UmbContentTypePropertyStructureManager x.containers?.filter((x) => x.type === containerType) ?? []); + return this.ownerContentTypeObservablePart((x) => x.containers?.filter((x) => x.type === containerType) ?? []); } getOwnerContainers(containerType: PropertyContainerTypes, parentId: string | null = null) { - return this.getOwnerDocumentType()?.containers?.filter((x) => x.parentId === parentId && x.type === containerType); + return this.getOwnerContentType()?.containers?.filter((x) => x.parentId === parentId && x.type === containerType); } isOwnerContainer(containerId: string) { - return this.getOwnerDocumentType()?.containers?.filter((x) => x.id === containerId); + return this.getOwnerContentType()?.containers?.filter((x) => x.id === containerId); } containersOfParentKey( @@ -455,14 +433,14 @@ export class UmbContentTypePropertyStructureManager observer.destroy()); - this.#documentTypeObservers = []; - this.#documentTypes.next([]); + this.#contentTypeObservers.forEach((observer) => observer.destroy()); + this.#contentTypeObservers = []; + this.#contentTypes.next([]); this.#containers.next([]); } public destroy() { this._reset(); - this.#documentTypes.complete(); + this.#contentTypes.complete(); this.#containers.complete(); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index fd805c2f97..8abc8eb4f4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -43,26 +43,26 @@ export class UmbDocumentTypeWorkspaceContext this.structure = new UmbContentTypePropertyStructureManager(this.host, this.repository); // General for content types: - this.data = this.structure.ownerDocumentType; - this.name = this.structure.ownerDocumentTypeObservablePart((data) => data?.name); - this.alias = this.structure.ownerDocumentTypeObservablePart((data) => data?.alias); - this.description = this.structure.ownerDocumentTypeObservablePart((data) => data?.description); - this.icon = this.structure.ownerDocumentTypeObservablePart((data) => data?.icon); - this.allowedAsRoot = this.structure.ownerDocumentTypeObservablePart((data) => data?.allowedAsRoot); - this.variesByCulture = this.structure.ownerDocumentTypeObservablePart((data) => data?.variesByCulture); - this.variesBySegment = this.structure.ownerDocumentTypeObservablePart((data) => data?.variesBySegment); - this.isElement = this.structure.ownerDocumentTypeObservablePart((data) => data?.isElement); - this.allowedContentTypes = this.structure.ownerDocumentTypeObservablePart((data) => data?.allowedContentTypes); - this.compositions = this.structure.ownerDocumentTypeObservablePart((data) => data?.compositions); + this.data = this.structure.ownerContentType; + this.name = this.structure.ownerContentTypeObservablePart((data) => data?.name); + this.alias = this.structure.ownerContentTypeObservablePart((data) => data?.alias); + this.description = this.structure.ownerContentTypeObservablePart((data) => data?.description); + this.icon = this.structure.ownerContentTypeObservablePart((data) => data?.icon); + this.allowedAsRoot = this.structure.ownerContentTypeObservablePart((data) => data?.allowedAsRoot); + this.variesByCulture = this.structure.ownerContentTypeObservablePart((data) => data?.variesByCulture); + this.variesBySegment = this.structure.ownerContentTypeObservablePart((data) => data?.variesBySegment); + this.isElement = this.structure.ownerContentTypeObservablePart((data) => data?.isElement); + this.allowedContentTypes = this.structure.ownerContentTypeObservablePart((data) => data?.allowedContentTypes); + this.compositions = this.structure.ownerContentTypeObservablePart((data) => data?.compositions); // Document type specific: - this.allowedTemplateIds = this.structure.ownerDocumentTypeObservablePart((data) => data?.allowedTemplateIds); - this.defaultTemplateId = this.structure.ownerDocumentTypeObservablePart((data) => data?.defaultTemplateId); - this.cleanup = this.structure.ownerDocumentTypeObservablePart((data) => data?.defaultTemplateId); + this.allowedTemplateIds = this.structure.ownerContentTypeObservablePart((data) => data?.allowedTemplateIds); + this.defaultTemplateId = this.structure.ownerContentTypeObservablePart((data) => data?.defaultTemplateId); + this.cleanup = this.structure.ownerContentTypeObservablePart((data) => data?.defaultTemplateId); } getData() { - return this.structure.getOwnerDocumentType() || {}; + return this.structure.getOwnerContentType() || {}; } getEntityId() { @@ -74,45 +74,45 @@ export class UmbDocumentTypeWorkspaceContext } setName(name: string) { - this.structure.updateOwnerDocumentType({ name }); + this.structure.updateOwnerContentType({ name }); } setAlias(alias: string) { - this.structure.updateOwnerDocumentType({ alias }); + this.structure.updateOwnerContentType({ alias }); } setDescription(description: string) { - this.structure.updateOwnerDocumentType({ description }); + this.structure.updateOwnerContentType({ description }); } // TODO: manage setting icon color alias? setIcon(icon: string) { - this.structure.updateOwnerDocumentType({ icon }); + this.structure.updateOwnerContentType({ icon }); } setAllowedAsRoot(allowedAsRoot: boolean) { - this.structure.updateOwnerDocumentType({ allowedAsRoot }); + this.structure.updateOwnerContentType({ allowedAsRoot }); } setVariesByCulture(variesByCulture: boolean) { - this.structure.updateOwnerDocumentType({ variesByCulture }); + this.structure.updateOwnerContentType({ variesByCulture }); } setVariesBySegment(variesBySegment: boolean) { - this.structure.updateOwnerDocumentType({ variesBySegment }); + this.structure.updateOwnerContentType({ variesBySegment }); } setIsElement(isElement: boolean) { - this.structure.updateOwnerDocumentType({ isElement }); + this.structure.updateOwnerContentType({ isElement }); } setAllowedContentTypes(allowedContentTypes: Array) { - this.structure.updateOwnerDocumentType({ allowedContentTypes }); + this.structure.updateOwnerContentType({ allowedContentTypes }); } setCompositions(compositions: Array) { - this.structure.updateOwnerDocumentType({ compositions }); + this.structure.updateOwnerContentType({ compositions }); } // Document type specific: setAllowedTemplateIds(allowedTemplateIds: Array) { - this.structure.updateOwnerDocumentType({ allowedTemplateIds }); + this.structure.updateOwnerContentType({ allowedTemplateIds }); } setDefaultTemplateId(defaultTemplateId: string) { - this.structure.updateOwnerDocumentType({ defaultTemplateId }); + this.structure.updateOwnerContentType({ defaultTemplateId }); } async create(parentId: string | null) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts index 037d1a3cb1..0c367870cd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts @@ -128,9 +128,13 @@ export class UmbDocumentTypeWorkspaceViewEditElement #requestRemoveTab(tab: PropertyTypeContainerModelBaseModel | undefined) { const Message: UmbConfirmModalData = { headline: 'Delete tab', - content: html`Are you sure you want to delete the tab ${tab?.name ?? tab?.id} + content: html`Are you sure you want to delete the tab ${tab?.name ?? tab?.id}
- This will delete all items that doesn't belong to a composition. + This will delete all items that doesn't belong to a composition.
`, confirmLabel: this.localize.term('actions_delete'), color: 'danger', @@ -183,7 +187,7 @@ export class UmbDocumentTypeWorkspaceViewEditElement (event.target as HTMLInputElement).value = 'Unnamed'; } - const changedName = this._workspaceContext?.structure.makeContainerNameUniqueForOwnerDocument( + const changedName = this._workspaceContext?.structure.makeContainerNameUniqueForOwnerContentType( newName, 'Tab', tab.id, @@ -280,7 +284,7 @@ export class UmbDocumentTypeWorkspaceViewEditElement - Reorder + Reorder `; } From e16bc543fa27cc3f6a64a264ccb96d0a742a331a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 14:58:46 +0200 Subject: [PATCH 19/54] update module in package.json --- src/Umbraco.Web.UI.Client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index a701dd726c..4f54ce2422 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -5,6 +5,7 @@ "type": "module", "exports": { ".": null, + "./app": "./dist-cms/apps/app/index.js", "./class-api": "./dist-cms/libs/class-api/index.js", "./context-api": "./dist-cms/libs/context-api/index.js", "./controller-api": "./dist-cms/libs/controller-api/index.js", @@ -13,7 +14,6 @@ "./localization-api": "./dist-cms/libs/localization-api/index.js", "./observable-api": "./dist-cms/libs/observable-api/index.js", "./auth": "./dist-cms/shared/auth/index.js", - "./context": "./dist-cms/shared/context/index.js", "./events": "./dist-cms/shared/umb-events/index.js", "./icon": "./dist-cms/shared/icon/index.js", "./models": "./dist-cms/shared/models/index.js", From 48a47da802661864748439676b42a7e3e5ffb9fd Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 20:13:12 +0200 Subject: [PATCH 20/54] remove label --- .../documents/document-types/entity-actions/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts index 02009df88e..6277318b0b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/manifests.ts @@ -18,7 +18,7 @@ const entityActions: Array = [ weight: 900, meta: { icon: 'umb:trash', - label: 'Delete (TBD)', + label: 'Delete', repositoryAlias: DOCUMENT_TYPE_REPOSITORY_ALIAS, api: UmbDeleteEntityAction, entityTypes: [entityType], From b89b1f00be7be1d8cea7fb224aa65c04ca435813 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 20:13:39 +0200 Subject: [PATCH 21/54] add item server data source --- .../sources/document-type-item.server.data.ts | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type-item.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type-item.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type-item.server.data.ts new file mode 100644 index 0000000000..f2f9e937e1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type-item.server.data.ts @@ -0,0 +1,39 @@ +import type { UmbItemDataSource } from '@umbraco-cms/backoffice/repository'; +import { DocumentTypeItemResponseModel, DocumentTypeResource } from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for Document Type items that fetches data from the server + * @export + * @class UmbDocumentTypeItemServerDataSource + * @implements {UmbItemDataSource} + */ +export class UmbDocumentTypeItemServerDataSource implements UmbItemDataSource { + #host: UmbControllerHostElement; + + /** + * Creates an instance of UmbDocumentTypeItemServerDataSource. + * @param {UmbControllerHostElement} host + * @memberof UmbDocumentTypeItemServerDataSource + */ + constructor(host: UmbControllerHostElement) { + this.#host = host; + } + + /** + * Fetches the items for the given ids from the server + * @param {Array} ids + * @return {*} + * @memberof UmbDocumentTypeItemServerDataSource + */ + async getItems(ids: Array) { + if (!ids) throw new Error('Ids are missing'); + return tryExecuteAndNotify( + this.#host, + DocumentTypeResource.getDocumentTypeItem({ + id: ids, + }), + ); + } +} From b44df9cb642e5b9960f42d4dc42d072df380d11d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 20:14:03 +0200 Subject: [PATCH 22/54] add doc type item store --- .../repository/document-type-item.store.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type-item.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type-item.store.ts new file mode 100644 index 0000000000..e6026475a0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type-item.store.ts @@ -0,0 +1,38 @@ +import { DocumentTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { 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 UmbDocumentTypeItemStore + * @extends {UmbStoreBase} + * @description - Data Store for Document Type items + */ + +export class UmbDocumentTypeItemStore + extends UmbStoreBase + implements UmbItemStore +{ + /** + * Creates an instance of UmbDocumentTypeItemStore. + * @param {UmbControllerHostElement} host + * @memberof UmbDocumentTypeItemStore + */ + constructor(host: UmbControllerHostElement) { + super( + host, + UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT_TOKEN.toString(), + new UmbArrayState([], (x) => x.id), + ); + } + + items(ids: Array) { + return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? ''))); + } +} + +export const UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT_TOKEN = new UmbContextToken( + 'UmbDocumentTypeItemStore', +); From 36c6ca04f44e27077c5a185fd3f27fd49c8b5c2d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 20:16:36 +0200 Subject: [PATCH 23/54] register doc type item store --- .../document-types/repository/manifests.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/manifests.ts index b5a3134cd9..e0eeda7941 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/manifests.ts @@ -1,7 +1,13 @@ +import { UmbDocumentTypeItemStore } from './document-type-item.store.js'; import { UmbDocumentTypeRepository } from './document-type.repository.js'; import { UmbDocumentTypeStore } from './document-type.store.js'; import { UmbDocumentTypeTreeStore } from './document-type.tree.store.js'; -import { ManifestRepository, ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extension-registry'; +import { + ManifestItemStore, + ManifestRepository, + ManifestStore, + ManifestTreeStore, +} from '@umbraco-cms/backoffice/extension-registry'; export const DOCUMENT_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentType'; @@ -14,6 +20,7 @@ const repository: ManifestRepository = { export const DOCUMENT_TYPE_STORE_ALIAS = 'Umb.Store.DocumentType'; export const DOCUMENT_TYPE_TREE_STORE_ALIAS = 'Umb.Store.DocumentTypeTree'; +export const DOCUMENT_TYPE_ITEM_STORE_ALIAS = 'Umb.Store.DocumentTypeItem'; const store: ManifestStore = { type: 'store', @@ -29,4 +36,11 @@ const treeStore: ManifestTreeStore = { class: UmbDocumentTypeTreeStore, }; -export const manifests = [repository, store, treeStore]; +const itemStore: ManifestItemStore = { + type: 'itemStore', + alias: DOCUMENT_TYPE_ITEM_STORE_ALIAS, + name: 'Document Type Item Store', + class: UmbDocumentTypeItemStore, +}; + +export const manifests = [repository, store, treeStore, itemStore]; From b08fe51372c5fba76635c2f5afd9ef70f370097b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 20:25:46 +0200 Subject: [PATCH 24/54] format --- .../packages/documents/document-types/repository/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/index.ts index bac7074196..b6bcde4a59 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/index.ts @@ -1,3 +1,3 @@ -export * from './document-type.repository.js' -export * from './document-type.store.js' -export * from './document-type.tree.store.js' +export * from './document-type.repository.js'; +export * from './document-type.store.js'; +export * from './document-type.tree.store.js'; From 541195b6c1cdd781a8fb6a5380fd377d9927d193 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 20:32:36 +0200 Subject: [PATCH 25/54] add requestItems method to doc type repository --- .../repository/document-type.repository.ts | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts index 52234e5c7f..5cd2ac49c2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts @@ -2,6 +2,8 @@ import { UmbDocumentTypeTreeServerDataSource } from './sources/document-type.tre import { UmbDocumentTypeServerDataSource } from './sources/document-type.server.data.js'; import { UmbDocumentTypeTreeStore, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN } from './document-type.tree.store.js'; import { UmbDocumentTypeStore, UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN } from './document-type.store.js'; +import { UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT_TOKEN, UmbDocumentTypeItemStore } from './document-type-item.store.js'; +import { UmbDocumentTypeItemServerDataSource } from './sources/document-type-item.server.data.js'; import type { UmbTreeDataSource, UmbTreeRepository, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; @@ -31,6 +33,9 @@ export class UmbDocumentTypeRepository #detailDataSource: UmbDocumentTypeServerDataSource; #detailStore?: UmbDocumentTypeStore; + #itemSource: UmbDocumentTypeItemServerDataSource; + #itemStore?: UmbDocumentTypeItemStore; + #notificationContext?: UmbNotificationContext; constructor(host: UmbControllerHostElement) { @@ -39,6 +44,7 @@ export class UmbDocumentTypeRepository // TODO: figure out how spin up get the correct data source this.#treeSource = new UmbDocumentTypeTreeServerDataSource(this.#host); this.#detailDataSource = new UmbDocumentTypeServerDataSource(this.#host); + this.#itemSource = new UmbDocumentTypeItemServerDataSource(this.#host); this.#init = Promise.all([ new UmbContextConsumerController(this.#host, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN, (instance) => { @@ -49,15 +55,17 @@ export class UmbDocumentTypeRepository this.#detailStore = instance; }), + new UmbContextConsumerController(this.#host, UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT_TOKEN, (instance) => { + this.#itemStore = instance; + }), + new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { this.#notificationContext = instance; }), ]); } - // TODO: Trash // TODO: Move - async requestTreeRoot() { await this.#init; @@ -97,6 +105,19 @@ export class UmbDocumentTypeRepository return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } + async requestItems(ids: Array) { + if (!ids) throw new Error('Document Type 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) }; + } + async requestItemsLegacy(ids: Array) { await this.#init; @@ -226,7 +247,6 @@ export class UmbDocumentTypeRepository } // General: - async delete(id: string) { if (!id) throw new Error('Document Type id is missing'); await this.#init; @@ -240,9 +260,10 @@ export class UmbDocumentTypeRepository // TODO: we currently don't use the detail store for anything. // Consider to look up the data before fetching from the server. // Consider notify a workspace if a template is deleted from the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. this.#detailStore?.remove([id]); this.#treeStore?.removeItem(id); - // TODO: would be nice to align the stores on methods/methodNames. + this.#itemStore?.removeItem(id); } return { error }; From 68fe35ead1d52377aa449f8c2820a37c812b2436 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 11:39:23 +0200 Subject: [PATCH 26/54] move cultures folder to core package --- .../{settings => core}/cultures/components/index.ts | 0 .../input-culture-select/input-culture-select.element.ts | 0 .../input-culture-select/input-culture-select.stories.ts | 0 .../src/packages/{settings => core}/cultures/manifests.ts | 0 .../cultures/repository/culture.repository.ts | 0 .../{settings => core}/cultures/repository/manifests.ts | 2 +- .../cultures/repository/sources/culture.server.data.ts | 0 .../{settings => core}/cultures/repository/sources/index.ts | 0 src/Umbraco.Web.UI.Client/src/packages/core/index.ts | 2 ++ .../details/language-details-workspace-view.element.ts | 6 +++--- .../src/packages/settings/manifests.ts | 2 -- 11 files changed, 6 insertions(+), 6 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/{settings => core}/cultures/components/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => core}/cultures/components/input-culture-select/input-culture-select.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => core}/cultures/components/input-culture-select/input-culture-select.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => core}/cultures/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => core}/cultures/repository/culture.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => core}/cultures/repository/manifests.ts (82%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => core}/cultures/repository/sources/culture.server.data.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => core}/cultures/repository/sources/index.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/cultures/components/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/components/input-culture-select/input-culture-select.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/input-culture-select/input-culture-select.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/cultures/components/input-culture-select/input-culture-select.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/input-culture-select/input-culture-select.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/components/input-culture-select/input-culture-select.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/input-culture-select/input-culture-select.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/cultures/components/input-culture-select/input-culture-select.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/input-culture-select/input-culture-select.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/cultures/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/cultures/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/culture.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/culture.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/culture.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/culture.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/manifests.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/manifests.ts index 3ef3e52787..0cfcf91047 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/manifests.ts @@ -1,4 +1,4 @@ -import { UmbCultureRepository } from '../repository/culture.repository.js'; +import { UmbCultureRepository } from './culture.repository.js'; import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; export const CULTURE_REPOSITORY_ALIAS = 'Umb.Repository.Culture'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/sources/culture.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/sources/culture.server.data.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/sources/culture.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/sources/culture.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/sources/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/cultures/repository/sources/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/sources/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 5674b63a4d..6ca3d56847 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -8,6 +8,7 @@ import { manifests as workspaceManifests } from './workspace/manifests.js'; import { manifests as modalManifests } from './modal/common/manifests.js'; import { manifests as themeManifests } from './themes/manifests.js'; import { manifests as conditionManifests } from './extension-registry/conditions/manifests.js'; +import { manifests as cultureManifests } from './cultures/manifests.js'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; @@ -53,6 +54,7 @@ const manifests: Array = [ ...workspaceManifests, ...modalManifests, ...themeManifests, + ...cultureManifests, ]; export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts index 38ce1d31d4..dcb4c165da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts @@ -1,5 +1,4 @@ import { UMB_LANGUAGE_WORKSPACE_CONTEXT } from '../../language-workspace.context.js'; -import type { UmbInputCultureSelectElement } from '../../../../../cultures/components/input-culture-select/input-culture-select.element.js'; import type { UmbInputLanguagePickerElement } from '../../../../components/input-language-picker/input-language-picker.element.js'; import { UUIBooleanInputEvent, UUIToggleElement } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; @@ -63,7 +62,8 @@ export class UmbLanguageDetailsWorkspaceViewElement #handleCultureChange(event: Event) { if (event instanceof UmbChangeEvent) { - const target = event.target as UmbInputCultureSelectElement; + // TODO: add correct type for event target + const target = event.target as any; const isoCode = target.value.toString(); const cultureName = target.selectedCultureName; @@ -129,7 +129,7 @@ export class UmbLanguageDetailsWorkspaceViewElement ${this._validationErrors?.isoCode.map( - (isoCodeError) => html`
${isoCodeError}
` + (isoCodeError) => html`
${isoCodeError}
`, )} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts index f84b93004b..31b0d628c7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts @@ -1,4 +1,3 @@ -import { manifests as cultureManifests } from './cultures/manifests.js'; import { manifests as dashboardManifests } from './dashboards/manifests.js'; import { manifests as dataTypeManifests } from './data-types/manifests.js'; import { manifests as extensionManifests } from './extensions/manifests.js'; @@ -8,7 +7,6 @@ import { manifests as settingsMenuManifests } from './menu.manifests.js'; import { manifests as settingsSectionManifests } from './section.manifests.js'; export const manifests = [ - ...cultureManifests, ...dashboardManifests, ...dataTypeManifests, ...extensionManifests, From 5e845acbecb2cb7e2eb3d4753ed9935021fbbdd5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 11:40:19 +0200 Subject: [PATCH 27/54] rename folder to culture --- .../src/packages/core/{cultures => culture}/components/index.ts | 0 .../input-culture-select/input-culture-select.element.ts | 0 .../input-culture-select/input-culture-select.stories.ts | 0 .../src/packages/core/{cultures => culture}/manifests.ts | 0 .../core/{cultures => culture}/repository/culture.repository.ts | 0 .../packages/core/{cultures => culture}/repository/manifests.ts | 0 .../repository/sources/culture.server.data.ts | 0 .../core/{cultures => culture}/repository/sources/index.ts | 0 src/Umbraco.Web.UI.Client/src/packages/core/index.ts | 2 +- 9 files changed, 1 insertion(+), 1 deletion(-) rename src/Umbraco.Web.UI.Client/src/packages/core/{cultures => culture}/components/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{cultures => culture}/components/input-culture-select/input-culture-select.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{cultures => culture}/components/input-culture-select/input-culture-select.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{cultures => culture}/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{cultures => culture}/repository/culture.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{cultures => culture}/repository/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{cultures => culture}/repository/sources/culture.server.data.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{cultures => culture}/repository/sources/index.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/culture/components/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/input-culture-select/input-culture-select.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/input-culture-select/input-culture-select.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/input-culture-select/input-culture-select.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/culture/components/input-culture-select/input-culture-select.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/input-culture-select/input-culture-select.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/input-culture-select/input-culture-select.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/cultures/components/input-culture-select/input-culture-select.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/culture/components/input-culture-select/input-culture-select.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/cultures/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/cultures/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/culture/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/culture.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/culture.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/culture.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/culture.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/sources/culture.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/sources/culture.server.data.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/sources/culture.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/sources/culture.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/sources/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/cultures/repository/sources/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/sources/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 6ca3d56847..4d1ee3939f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -8,7 +8,7 @@ import { manifests as workspaceManifests } from './workspace/manifests.js'; import { manifests as modalManifests } from './modal/common/manifests.js'; import { manifests as themeManifests } from './themes/manifests.js'; import { manifests as conditionManifests } from './extension-registry/conditions/manifests.js'; -import { manifests as cultureManifests } from './cultures/manifests.js'; +import { manifests as cultureManifests } from './culture/manifests.js'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; From e6c7ee7ba9bde3de2900efcd5ee08ae5bc3c134f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 12:19:00 +0200 Subject: [PATCH 28/54] export from culture --- .../packages/core/culture/components/index.ts | 2 +- .../input-culture-select.element.ts | 19 +++++++------------ .../src/packages/core/culture/index.ts | 2 ++ .../src/packages/core/index.ts | 1 + 4 files changed, 11 insertions(+), 13 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/culture/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/index.ts index 89534cfe03..641ed05f47 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/index.ts @@ -1 +1 @@ -import './input-culture-select/input-culture-select.element.js'; +export * from './input-culture-select/input-culture-select.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/input-culture-select/input-culture-select.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/input-culture-select/input-culture-select.element.ts index 3e46317d53..4e04199eb3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/input-culture-select/input-culture-select.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/culture/components/input-culture-select/input-culture-select.element.ts @@ -1,10 +1,6 @@ import { UmbCultureRepository } from '../../repository/culture.repository.js'; -import { css, html, repeat, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { - FormControlMixin, - UUIComboboxElement, - UUIComboboxEvent, -} from '@umbraco-cms/backoffice/external/uui'; +import { html, repeat, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin, UUIComboboxElement, UUIComboboxEvent } from '@umbraco-cms/backoffice/external/uui'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/events'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { CultureReponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -89,12 +85,11 @@ export class UmbInputCultureSelectElement extends FormControlMixin(UmbLitElement ${repeat( this.#filteredCultures, (culture) => culture.name, - (culture) => - html` - ${culture.englishName} - ` + (culture) => html` + ${culture.englishName} + `, )} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/culture/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/index.ts new file mode 100644 index 0000000000..f2a5fca5ad --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/culture/index.ts @@ -0,0 +1,2 @@ +export * from './components/index.js'; +export * from './repository/culture.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 4d1ee3939f..4c3c6ecc97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -43,6 +43,7 @@ export * from './store/index.js'; export * from './tree/index.js'; export * from './variant/index.js'; export * from './workspace/index.js'; +export * from './culture/index.js'; const manifests: Array = [ ...conditionManifests, From 1a4985d23ac07b7dcdd7a684845ce9640fa743db Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 12:26:57 +0200 Subject: [PATCH 29/54] add culture module --- src/Umbraco.Web.UI.Client/tsconfig.json | 1 + src/Umbraco.Web.UI.Client/web-test-runner.config.mjs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 1d53fb8ce9..d4de6fd9d6 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -77,6 +77,7 @@ "@umbraco-cms/backoffice/tree": ["src/packages/core/tree"], "@umbraco-cms/backoffice/variant": ["src/packages/core/variant"], "@umbraco-cms/backoffice/workspace": ["src/packages/core/workspace"], + "@umbraco-cms/backoffice/culture": ["src/packages/core/culture"], "@umbraco-cms/backoffice/dictionary": ["./src/packages/dictionary/dictionary/index.ts"], diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs index 7d40238f51..397aed2b1b 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -78,6 +78,7 @@ export default { '@umbraco-cms/backoffice/tree': './src/packages/core/tree/index.ts', '@umbraco-cms/backoffice/variant': './src/packages/core/variant/index.ts', '@umbraco-cms/backoffice/workspace': './src/packages/core/workspace/index.ts', + '@umbraco-cms/backoffice/culture': './src/packages/core/culture/index.ts', '@umbraco-cms/backoffice/dictionary': './src/packages/dictionary/dictionary/index.ts', From 0ffba63c73185f6d933bb7d0d9fc5708b34fdffa Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 12:32:23 +0200 Subject: [PATCH 30/54] import type from culture module --- .../views/details/language-details-workspace-view.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts index dcb4c165da..1b521cae1c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts @@ -1,3 +1,4 @@ +import type { UmbInputCultureSelectElement } from '@umbraco-cms/backoffice/culture'; import { UMB_LANGUAGE_WORKSPACE_CONTEXT } from '../../language-workspace.context.js'; import type { UmbInputLanguagePickerElement } from '../../../../components/input-language-picker/input-language-picker.element.js'; import { UUIBooleanInputEvent, UUIToggleElement } from '@umbraco-cms/backoffice/external/uui'; @@ -62,8 +63,7 @@ export class UmbLanguageDetailsWorkspaceViewElement #handleCultureChange(event: Event) { if (event instanceof UmbChangeEvent) { - // TODO: add correct type for event target - const target = event.target as any; + const target = event.target as UmbInputCultureSelectElement; const isoCode = target.value.toString(); const cultureName = target.selectedCultureName; From dfb951f8759b06efd1327ef52d140c4ebf1ce9cb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Sep 2023 15:00:09 +0200 Subject: [PATCH 31/54] add module to package.json --- src/Umbraco.Web.UI.Client/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index d8d4de86ef..b1c92ed03d 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -26,6 +26,7 @@ "./collection": "./dist-cms/packages/core/collection/index.js", "./components": "./dist-cms/packages/core/components/index.js", "./content-type": "./dist-cms/packages/core/content-type/index.js", + "./culture": "./dist-cms/packages/core/culture/index.js", "./debug": "./dist-cms/packages/core/debug/index.js", "./entity-action": "./dist-cms/packages/core/entity-action/index.js", "./entity-bulk-action": "./dist-cms/packages/core/entity-bulk-action/index.js", From 96c277e5137c04c6c3f47d96ad37ae89f5d38b25 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 31 Aug 2023 12:51:56 +0200 Subject: [PATCH 32/54] add data file --- .../src/mocks/data/scripts.data.ts | 176 ++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts new file mode 100644 index 0000000000..025a1e11ee --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts @@ -0,0 +1,176 @@ +import { UmbEntityData } from './entity.data.js'; +import { createFileSystemTreeItem, createTextFileItem } from './utils.js'; +import { + CreateTextFileViewModelBaseModel, + FileSystemTreeItemPresentationModel, + PagedFileSystemTreeItemPresentationModel, + PartialViewResponseModel, + PartialViewSnippetResponseModel, + ScriptResponseModel, + SnippetItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +type ScriptsDataItem = ScriptResponseModel & FileSystemTreeItemPresentationModel & { id: string }; + +export const treeData: Array = [ + { + id: 'some-folder', + path: 'some-folder', + isFolder: true, + name: 'some-folder', + type: 'script', + hasChildren: true, + }, + { + id: 'another-folder', + path: 'another-folder', + isFolder: true, + name: 'another-folder', + type: 'script', + hasChildren: true, + }, + { + id: 'very important folder', + path: 'very important folder', + isFolder: true, + name: 'very important folder', + type: 'script', + hasChildren: true, + }, + { + id: 'some-folder/ugly script.js', + path: 'some-folder/ugly script.js', + isFolder: false, + name: 'ugly script.js', + type: 'script', + hasChildren: false, + content: `function makeid(length) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + var charactersLength = characters.length; + for ( var i = 0; i < length; i++ ) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } + + console.log(makeid(5));`, + }, + { + id: 'some-folder/nice script.js', + path: 'some-folder/nice script.js', + isFolder: false, + name: 'nice script.js', + type: 'script', + hasChildren: false, + content: `var items = { + "item_1": "1", + "item_2": "2", + "item_3": "3" + } + for (var item in items) { + console.log(items[item]); + }`, + }, + { + id: 'another-folder/only bugs.js', + path: 'another-folder/only bugs.js', + isFolder: false, + name: 'only bugs.js', + type: 'script', + hasChildren: false, + content: `var my_arr = [4, '', 0, 10, 7, '', false, 10]; + + my_arr = my_arr.filter(Boolean); + + console.log(my_arr);`, + }, + { + id: 'very important folder/no bugs at all.js', + path: 'very important folder/no bugs at all.js', + isFolder: false, + name: 'no bugs at all.js', + type: 'script', + hasChildren: false, + content: `const date_str = "07/20/2021"; + const date = new Date(date_str); + const full_day_name = date.toLocaleDateString('default', { weekday: 'long' }); + // -> to get full day name e.g. Tuesday + + const short_day_name = date.toLocaleDateString('default', { weekday: 'short' }); + console.log(short_day_name); + // -> TO get the short day name e.g. Tue`, + }, + { + id: 'very important folder/nope.js', + path: 'very important folder/nope.js', + isFolder: false, + name: 'nope.js', + type: 'script', + hasChildren: false, + content: `// Define an object + const employee = { + "name": "John Deo", + "department": "IT", + "project": "Inventory Manager" + }; + + // Remove a property + delete employee["project"]; + + console.log(employee);`, + }, +]; + +class UmbScriptsTreeData extends UmbEntityData { + constructor() { + super(treeData); + } + + getTreeRoot(): PagedFileSystemTreeItemPresentationModel { + const items = this.data.filter((item) => item.path?.includes('/') === false); + const treeItems = items.map((item) => createFileSystemTreeItem(item)); + const total = items.length; + return { items: treeItems, total }; + } + + getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel { + const items = this.data.filter((item) => item.path?.startsWith(parentPath + '/')); + const treeItems = items.map((item) => createFileSystemTreeItem(item)); + const total = items.length; + return { items: treeItems, total }; + } + + getTreeItem(paths: Array): Array { + const items = this.data.filter((item) => paths.includes(item.path ?? '')); + return items.map((item) => createFileSystemTreeItem(item)); + } +} + +export const umbScriptsTreeData = new UmbScriptsTreeData(); + +class UmbScriptsData extends UmbEntityData { + constructor() { + super(treeData); + } + + getPartialView(path: string): PartialViewResponseModel | undefined { + return createTextFileItem(this.data.find((item) => item.path === path)); + } + + insertPartialView(item: CreateTextFileViewModelBaseModel) { + const newItem: ScriptsDataItem = { + ...item, + path: `${item.parentPath}/${item.name}.js}`, + id: `${item.parentPath}/${item.name}.js}`, + isFolder: false, + hasChildren: false, + type: 'script', + }; + + this.insert(newItem); + return newItem; + } +} + +export const umbPartialViewsData = new UmbScriptsData(); From ad977e51918284d827d819fd57ec7d57dc50fcf4 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 4 Sep 2023 10:31:12 +0200 Subject: [PATCH 33/54] scripts handlers & data --- .../src/mocks/data/scripts.data.ts | 42 ++++++++-- .../src/mocks/handlers/scripts.handlers.ts | 80 +++++++++++++++++++ 2 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts index 025a1e11ee..3929fc8119 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts @@ -1,6 +1,7 @@ import { UmbEntityData } from './entity.data.js'; import { createFileSystemTreeItem, createTextFileItem } from './utils.js'; import { + CreatePathFolderRequestModel, CreateTextFileViewModelBaseModel, FileSystemTreeItemPresentationModel, PagedFileSystemTreeItemPresentationModel, @@ -12,7 +13,7 @@ import { type ScriptsDataItem = ScriptResponseModel & FileSystemTreeItemPresentationModel & { id: string }; -export const treeData: Array = [ +export const data: Array = [ { id: 'some-folder', path: 'some-folder', @@ -124,7 +125,7 @@ export const treeData: Array = [ class UmbScriptsTreeData extends UmbEntityData { constructor() { - super(treeData); + super(data); } getTreeRoot(): PagedFileSystemTreeItemPresentationModel { @@ -147,18 +148,47 @@ class UmbScriptsTreeData extends UmbEntityData { + constructor() { + super(data); + } + + getFolder(path: string): FileSystemTreeItemPresentationModel { + const items = data.filter((item) => item.isFolder && item.path === path); + const total = items.length; + return items as FileSystemTreeItemPresentationModel; + } + + postFolder(payload: CreatePathFolderRequestModel) { + const newFolder = { + id: `${payload.parentPath ?? ''}/${payload.name}`, + path: `${payload.parentPath ?? ''}/${payload.name}`, + isFolder: true, + name: payload.name, + type: 'script', + hasChildren: false, + }; + return this.insert(newFolder); + } + + deleteFolder(path: string) { + return this.delete([path]); + } +} + export const umbScriptsTreeData = new UmbScriptsTreeData(); +export const umbScriptsFolderData = new UmbScriptsFolderData(); class UmbScriptsData extends UmbEntityData { constructor() { - super(treeData); + super(data); } - getPartialView(path: string): PartialViewResponseModel | undefined { + getScript(path: string): ScriptResponseModel | undefined { return createTextFileItem(this.data.find((item) => item.path === path)); } - insertPartialView(item: CreateTextFileViewModelBaseModel) { + insertScript(item: CreateTextFileViewModelBaseModel) { const newItem: ScriptsDataItem = { ...item, path: `${item.parentPath}/${item.name}.js}`, @@ -173,4 +203,4 @@ class UmbScriptsData extends UmbEntityData { } } -export const umbPartialViewsData = new UmbScriptsData(); +export const umbScriptsData = new UmbScriptsData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts new file mode 100644 index 0000000000..848c28b3ec --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts @@ -0,0 +1,80 @@ +const { rest } = window.MockServiceWorker; +import { RestHandler, MockedRequest, DefaultBodyType } from 'msw'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; +import { CreatePathFolderRequestModel, CreateTextFileViewModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbScriptsTreeData, umbScriptsData, umbScriptsFolderData } from '../data/scripts.data.js'; + +const treeHandlers = [ + rest.get(umbracoPath('/tree/script/root'), (req, res, ctx) => { + const response = umbScriptsTreeData.getTreeRoot(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath('/tree/script/children'), (req, res, ctx) => { + const path = req.url.searchParams.get('path'); + if (!path) return; + + const response = umbScriptsTreeData.getTreeItemChildren(path); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath('/tree/script/item'), (req, res, ctx) => { + const paths = req.url.searchParams.getAll('paths'); + if (!paths) return; + + const items = umbScriptsTreeData.getTreeItem(paths); + return res(ctx.status(200), ctx.json(items)); + }), +]; + +const detailHandlers: RestHandler>[] = [ + rest.get(umbracoPath('/script'), (req, res, ctx) => { + const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); + if (!path) return res(ctx.status(400)); + const response = umbScriptsData.getScript(path); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.post(umbracoPath('/script'), (req, res, ctx) => { + const requestBody = req.json() as CreateTextFileViewModelBaseModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const response = umbScriptsData.insertScript(requestBody); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.delete(umbracoPath('/script'), (req, res, ctx) => { + const path = req.url.searchParams.get('path'); + if (!path) return res(ctx.status(400)); + const response = umbScriptsData.delete([path]); + return res(ctx.status(200), ctx.json(response)); + }), + rest.put(umbracoPath('/script'), (req, res, ctx) => { + const requestBody = req.json() as CreateTextFileViewModelBaseModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const response = umbScriptsData.updateData(requestBody); + return res(ctx.status(200)); + }), +]; + +const folderHandlers: RestHandler>[] = [ + rest.get(umbracoPath('script/folder'), (req, res, ctx) => { + const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); + if (!path) return res(ctx.status(400)); + const response = umbScriptsFolderData.getFolder(path); + return res(ctx.status(200), ctx.json(response)); + }), + rest.post(umbracoPath('script/folder'), (req, res, ctx) => { + const requestBody = req.json() as CreatePathFolderRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const response = umbScriptsFolderData.postFolder(requestBody); + return res(ctx.status(200)); + }), + rest.delete(umbracoPath('script/folder'), (req, res, ctx) => { + const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); + if (!path) return res(ctx.status(400)); + const response = umbScriptsFolderData.deleteFolder(path); + return res(ctx.status(200), ctx.json(response)); + }), +]; + +export const handlers = [...treeHandlers, ...detailHandlers, ...folderHandlers]; From a0a09a33e16c3813e0a27eed07201d3a495096a4 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 4 Sep 2023 10:32:17 +0200 Subject: [PATCH 34/54] cleanup --- src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts | 4 ---- .../src/mocks/handlers/scripts.handlers.ts | 4 +--- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts index 3929fc8119..74016f97fc 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts @@ -5,10 +5,7 @@ import { CreateTextFileViewModelBaseModel, FileSystemTreeItemPresentationModel, PagedFileSystemTreeItemPresentationModel, - PartialViewResponseModel, - PartialViewSnippetResponseModel, ScriptResponseModel, - SnippetItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; type ScriptsDataItem = ScriptResponseModel & FileSystemTreeItemPresentationModel & { id: string }; @@ -155,7 +152,6 @@ class UmbScriptsFolderData extends UmbEntityData { getFolder(path: string): FileSystemTreeItemPresentationModel { const items = data.filter((item) => item.isFolder && item.path === path); - const total = items.length; return items as FileSystemTreeItemPresentationModel; } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts index 848c28b3ec..0ed02833d8 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts @@ -1,8 +1,8 @@ const { rest } = window.MockServiceWorker; import { RestHandler, MockedRequest, DefaultBodyType } from 'msw'; +import { umbScriptsTreeData, umbScriptsData, umbScriptsFolderData } from '../data/scripts.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import { CreatePathFolderRequestModel, CreateTextFileViewModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -import { umbScriptsTreeData, umbScriptsData, umbScriptsFolderData } from '../data/scripts.data.js'; const treeHandlers = [ rest.get(umbracoPath('/tree/script/root'), (req, res, ctx) => { @@ -51,7 +51,6 @@ const detailHandlers: RestHandler>[] = [ rest.put(umbracoPath('/script'), (req, res, ctx) => { const requestBody = req.json() as CreateTextFileViewModelBaseModel; if (!requestBody) return res(ctx.status(400, 'no body found')); - const response = umbScriptsData.updateData(requestBody); return res(ctx.status(200)); }), ]; @@ -66,7 +65,6 @@ const folderHandlers: RestHandler>[] = [ rest.post(umbracoPath('script/folder'), (req, res, ctx) => { const requestBody = req.json() as CreatePathFolderRequestModel; if (!requestBody) return res(ctx.status(400, 'no body found')); - const response = umbScriptsFolderData.postFolder(requestBody); return res(ctx.status(200)); }), rest.delete(umbracoPath('script/folder'), (req, res, ctx) => { From b8a4cf20622d01e1679959d5546791217478b121 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:40:44 +0200 Subject: [PATCH 35/54] add scripts files --- .../src/packages/templating/scripts/config.ts | 15 ++ .../create/create-empty.action.ts | 12 + .../scripts/entity-actions/manifests.ts | 70 ++++++ .../src/packages/templating/scripts/index.ts | 1 + .../packages/templating/scripts/manifests.ts | 13 ++ .../templating/scripts/menu-item/manifests.ts | 19 ++ .../templating/scripts/repository/index.ts | 1 + .../scripts/repository/manifests.ts | 28 +++ .../scripts/repository/scripts.repository.ts | 218 ++++++++++++++++++ .../scripts/repository/scripts.store.ts | 45 ++++ .../scripts/repository/scripts.tree.store.ts | 26 +++ .../scripts/repository/sources/index.ts | 19 ++ .../sources/scripts.detail.server.data.ts | 77 +++++++ .../sources/scripts.folder.server.data.ts | 35 +++ .../sources/scripts.tree.server.data.ts | 54 +++++ .../templating/scripts/tree/manifests.ts | 29 +++ .../templating/scripts/workspace/manifests.ts | 35 +++ .../scripts-workspace-edit.element.ts | 171 ++++++++++++++ .../workspace/scripts-workspace.context.ts | 97 ++++++++ .../workspace/scripts-workspace.element.ts | 58 +++++ 20 files changed, 1023 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/create/create-empty.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.detail.server.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.folder.server.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.tree.server.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts new file mode 100644 index 0000000000..e534246dc5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts @@ -0,0 +1,15 @@ +import { ScriptResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export type ScriptDetails = ScriptResponseModel; + +export const SCRIPTS_ENTITY_TYPE = 'script'; +export const SCRIPTS_ROOT_ENTITY_TYPE = 'script-root'; +export const SCRIPTS_FOLDER_ENTITY_TYPE = 'script-folder'; +export const SCRIPTS_FOLDER_EMPTY_ENTITY_TYPE = 'script-folder-empty'; + +export const SCRIPTS_REPOSITORY_ALIAS = 'Umb.Repository.Scripts'; + +export const SCRIPTS_TREE_ALIAS = 'Umb.Tree.Scripts'; + +export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts.Tree'; +export const UMB_SCRIPTS_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/create/create-empty.action.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/create/create-empty.action.ts new file mode 100644 index 0000000000..7421a3c713 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/create/create-empty.action.ts @@ -0,0 +1,12 @@ +import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbCreateScriptAction }> extends UmbEntityActionBase { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { + super(host, repositoryAlias, unique); + } + + async execute() { + history.pushState(null, '', `section/settings/workspace/script/create/${this.unique ?? 'null'}`); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts new file mode 100644 index 0000000000..5de72e500f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts @@ -0,0 +1,70 @@ +import { + SCRIPTS_REPOSITORY_ALIAS, + SCRIPTS_ENTITY_TYPE, + SCRIPTS_FOLDER_ENTITY_TYPE, + SCRIPTS_ROOT_ENTITY_TYPE, + SCRIPTS_FOLDER_EMPTY_ENTITY_TYPE, +} from '../config.js'; +import { UmbCreateScriptAction } from './create/create-empty.action.js'; +import { + UmbCreateFolderEntityAction, + UmbDeleteEntityAction, + UmbDeleteFolderEntityAction, +} from '@umbraco-cms/backoffice/entity-action'; +import { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; + +const scriptsViewActions: Array = [ + { + type: 'entityAction', + alias: 'Umb.EntityAction.PartialView.Delete', + name: 'Delete PartialView Entity Action', + meta: { + icon: 'umb:trash', + label: 'Delete', + api: UmbDeleteEntityAction, + repositoryAlias: SCRIPTS_REPOSITORY_ALIAS, + entityTypes: [SCRIPTS_ENTITY_TYPE], + }, + }, +]; + +const scriptsFolderActions: Array = [ + { + type: 'entityAction', + alias: 'Umb.EntityAction.PartialViewFolder.Create.New', + name: 'Create PartialView Entity Under Directory Action', + meta: { + icon: 'umb:article', + label: 'New empty partial view', + api: UmbCreateScriptAction, + repositoryAlias: SCRIPTS_REPOSITORY_ALIAS, + entityTypes: [SCRIPTS_FOLDER_ENTITY_TYPE, SCRIPTS_ROOT_ENTITY_TYPE], + }, + }, + { + type: 'entityAction', + alias: 'Umb.EntityAction.PartialViewFolder.DeleteFolder', + name: 'Remove empty folder', + meta: { + icon: 'umb:trash', + label: 'Remove folder', + api: UmbDeleteFolderEntityAction, + repositoryAlias: SCRIPTS_REPOSITORY_ALIAS, + entityTypes: [SCRIPTS_FOLDER_EMPTY_ENTITY_TYPE], + }, + }, + { + type: 'entityAction', + alias: 'Umb.EntityAction.PartialViewFolder.CreateFolder', + name: 'Create empty folder', + meta: { + icon: 'umb:add', + label: 'Create folder', + api: UmbCreateFolderEntityAction, + repositoryAlias: SCRIPTS_REPOSITORY_ALIAS, + entityTypes: [SCRIPTS_FOLDER_EMPTY_ENTITY_TYPE, SCRIPTS_FOLDER_ENTITY_TYPE, SCRIPTS_ROOT_ENTITY_TYPE], + }, + }, +]; + +export const manifests = [...scriptsViewActions, ...scriptsFolderActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts new file mode 100644 index 0000000000..3d76f338dd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts @@ -0,0 +1 @@ +export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/manifests.ts new file mode 100644 index 0000000000..1f440270ba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/manifests.ts @@ -0,0 +1,13 @@ +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as menuItemManifests } from './menu-item/manifests.js'; +import { manifests as treeManifests } from './tree/manifests.js'; +import { manifests as entityActionsManifests } from './entity-actions/manifests.js'; +import { manifests as workspaceManifests } from './workspace/manifests.js'; + +export const manifests = [ + ...repositoryManifests, + ...menuItemManifests, + ...treeManifests, + ...entityActionsManifests, + ...workspaceManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts new file mode 100644 index 0000000000..1459ef62ff --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts @@ -0,0 +1,19 @@ +import { SCRIPTS_ENTITY_TYPE, SCRIPTS_TREE_ALIAS } from '../config.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const menuItem: ManifestTypes = { + type: 'menuItem', + kind: 'tree', + alias: 'Umb.MenuItem.Scripts', + name: 'Scripts Menu Item', + weight: 40, + meta: { + label: 'Scripts', + icon: 'umb:folder', + entityType: SCRIPTS_ENTITY_TYPE, + treeAlias: SCRIPTS_TREE_ALIAS, + menus: ['Umb.Menu.Templating'], + }, +}; + +export const manifests = [menuItem]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/index.ts new file mode 100644 index 0000000000..8b6bcfbff6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/index.ts @@ -0,0 +1 @@ +export * from './scripts.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts new file mode 100644 index 0000000000..3cdaeef6c5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts @@ -0,0 +1,28 @@ +import { ManifestRepository, ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extension-registry'; +import { SCRIPTS_REPOSITORY_ALIAS } from '../config.js'; + +const repository: ManifestRepository = { + type: 'repository', + alias: SCRIPTS_REPOSITORY_ALIAS, + name: 'Partial Views Repository', + class: UmbScriptsRepository, +}; + +export const SCRIPTS_STORE_ALIAS = 'Umb.Store.PartialViews'; +export const SCRIPTS_TREE_STORE_ALIAS = 'Umb.Store.PartialViewsTree'; + +const store: ManifestStore = { + type: 'store', + alias: SCRIPTS_STORE_ALIAS, + name: 'Partial Views Store', + class: UmbScriptsStore, +}; + +const treeStore: ManifestTreeStore = { + type: 'treeStore', + alias: SCRIPTS_TREE_STORE_ALIAS, + name: 'Partial Views Tree Store', + class: UmbScriptsTreeStore, +}; + +export const manifests = [repository, store, treeStore]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts new file mode 100644 index 0000000000..dc666c21ed --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts @@ -0,0 +1,218 @@ +import { PARTIAL_VIEW_ROOT_ENTITY_TYPE } from '../../partial-views/config.js'; +import { UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT_TOKEN } from '../../partial-views/repository/partial-views.tree.store.js'; +import { PartialViewGetFolderResponse } from '../../partial-views/repository/sources/partial-views.folder.server.data.js'; +import { UmbScriptsTreeServerDataSource } from './sources/scripts.tree.server.data.js'; +import { UmbScriptsServerDataSource } from './sources/scripts.detail.server.data.js'; +import { UmbScriptsFolderServerDataSource } from './sources/scripts.folder.server.data.js'; +import { UmbScriptsTreeStore } from './scripts.tree.store.js'; +import { + DataSourceResponse, + UmbDataSourceErrorResponse, + UmbDetailRepository, + UmbFolderRepository, + UmbTreeRepository, +} from '@umbraco-cms/backoffice/repository'; +import { + CreateFolderRequestModel, + CreateScriptRequestModel, + FileItemResponseModelBaseModel, + FileSystemTreeItemPresentationModel, + FolderModelBaseModel, + FolderResponseModel, + ProblemDetails, + ScriptResponseModel, + TextFileResponseModelBaseModel, + UpdateScriptRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; + +export class UmbScriptsRepository + implements + UmbTreeRepository, + UmbDetailRepository, + UmbFolderRepository +{ + #init; + #host: UmbControllerHostElement; + + #treeDataSource: UmbScriptsTreeServerDataSource; + #detailDataSource: UmbScriptsServerDataSource; + #folderDataSource: UmbScriptsFolderServerDataSource; + + #treeStore?: UmbScriptsTreeStore; + + constructor(host: UmbControllerHostElement) { + this.#host = host; + + this.#treeDataSource = new UmbScriptsTreeServerDataSource(this.#host); + this.#detailDataSource = new UmbScriptsServerDataSource(this.#host); + this.#folderDataSource = new UmbScriptsFolderServerDataSource(this.#host); + + this.#init = Promise.all([ + new UmbContextConsumerController(this.#host, UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT_TOKEN, (instance) => { + this.#treeStore = instance; + }), + ]); + } + + //#region FOLDER + createFolderScaffold( + parentId: string | null, + ): Promise<{ data?: FolderResponseModel | undefined; error?: ProblemDetails | undefined }> { + const data: FolderResponseModel = { + name: '', + parentId, + }; + return Promise.resolve({ data, error: undefined }); + } + async createFolder( + requestBody: CreateFolderRequestModel, + ): Promise<{ data?: string | undefined; error?: ProblemDetails | undefined }> { + await this.#init; + const req = { + parentPath: requestBody.parentId, + name: requestBody.name, + }; + const promise = this.#folderDataSource.insert(req); + await promise; + this.requestTreeItemsOf(requestBody.parentId ? requestBody.parentId : null); + return promise; + } + async requestFolder( + unique: string, + ): Promise<{ data?: PartialViewGetFolderResponse | 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); + return promise; + } + //#endregion + + //#region TREE + + async requestTreeRoot() { + await this.#init; + + const data = { + id: null, + path: null, + type: PARTIAL_VIEW_ROOT_ENTITY_TYPE, + name: 'Partial Views', + icon: 'umb: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, asObservable: () => this.#treeStore!.rootItems }; + } + + async requestTreeItemsOf(path: string | null) { + if (path === null) { + return this.requestRootTreeItems(); + } + + await this.#init; + + const { data, error } = await this.#treeDataSource.getChildrenOf({ path, skip: 0, take: 100 }); + if (data) { + this.#treeStore!.appendItems(data.items); + } + + return { data, error, asObservable: () => this.#treeStore!.childrenOf(path) }; + } + + async requestTreeItems(keys: Array) { + await this.#init; + + if (!keys) { + const error: ProblemDetails = { title: 'Keys are missing' }; + return { data: undefined, error }; + } + + const { data, error } = await this.#treeDataSource.getItem(keys); + + return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + } + + 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 treeItems(paths: Array) { + if (!paths) throw new Error('Paths are missing'); + await this.#init; + return this.#treeStore!.items(paths); + } + //#endregion + + //#region DETAILS + async requestByKey(path: string) { + if (!path) throw new Error('Path is missing'); + await this.#init; + const { data, error } = await this.#detailDataSource.get(path); + return { data, error }; + } + + requestById(id: string): Promise> { + throw new Error('Method not implemented.'); + } + byId(id: string): Promise> { + throw new Error('Method not implemented.'); + } + + createScaffold(parentId: string | null, preset: string): Promise> { + return this.#detailDataSource.createScaffold(parentId, preset); + } + async create(data: CreateScriptRequestModel): Promise> { + const promise = this.#detailDataSource.insert(data); + await promise; + this.requestTreeItemsOf(data.parentPath ? data.parentPath : null); + return promise; + } + save(id: string, requestBody: UpdateScriptRequestModel): Promise { + return this.#detailDataSource.update(id, requestBody); + } + async delete(id: string): Promise { + const promise = this.#detailDataSource.delete(id); + const parentPath = id.substring(0, id.lastIndexOf('/')); + this.requestTreeItemsOf(parentPath ? parentPath : null); + return promise; + } + + requestItems(keys: Array): Promise> { + return this.#detailDataSource.getItems(keys); + } + + //#endregion +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.store.ts new file mode 100644 index 0000000000..2f6a97972f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.store.ts @@ -0,0 +1,45 @@ +import { UMB_SCRIPTS_STORE_CONTEXT_TOKEN_ALIAS } from '../config.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; +import type { TemplateResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; + +/** + * @export + * @class UmbPartialViewsStore + * @extends {UmbStoreBase} + * @description - Data Store for partial views + */ +export class UmbScriptsStore extends UmbStoreBase { + /** + * Creates an instance of UmbPartialViewsStore. + * @param {UmbControllerHostInterface} host + * @memberof UmbPartialViewsStore + */ + constructor(host: UmbControllerHostElement) { + super(host, UMB_SCRIPTS_STORE_CONTEXT_TOKEN.toString(), new UmbArrayState([], (x) => x.id)); + } + + /** + * Append a partial view to the store + * @param {Template} template + * @memberof UmbPartialViewsStore + */ + append(template: TemplateResponseModel) { + this._data.append([template]); + } + + /** + * Removes partial views in the store with the given uniques + * @param {string[]} uniques + * @memberof UmbPartialViewsStore + */ + remove(uniques: string[]) { + this._data.remove(uniques); + } +} + +export const UMB_SCRIPTS_STORE_CONTEXT_TOKEN = new UmbContextToken( + UMB_SCRIPTS_STORE_CONTEXT_TOKEN_ALIAS, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts new file mode 100644 index 0000000000..c3a298f312 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts @@ -0,0 +1,26 @@ +import { UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN_ALIAS } from '../config.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbFileSystemTreeStore } from '@umbraco-cms/backoffice/store'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; + +export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( + UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN_ALIAS, +); + +/** + * Tree Store for partial views + * + * @export + * @class UmbPartialViewsTreeStore + * @extends {UmbEntityTreeStore} + */ +export class UmbPartialViewsTreeStore extends UmbFileSystemTreeStore { + /** + * Creates an instance of UmbPartialViewsTreeStore. + * @param {UmbControllerHostInterface} host + * @memberof UmbPartialViewsTreeStore + */ + constructor(host: UmbControllerHostElement) { + super(host, UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN.toString()); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/index.ts new file mode 100644 index 0000000000..0e00d1bfdd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/index.ts @@ -0,0 +1,19 @@ +import { + FileSystemTreeItemPresentationModel, + PagedFileSystemTreeItemPresentationModel, +} from '@umbraco-cms/backoffice/backend-api'; +import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; + +export interface ScriptsTreeDataSource { + getRootItems(): Promise>; + getChildrenOf({ + path, + skip, + take, + }: { + path?: string | undefined; + skip?: number | undefined; + take?: number | undefined; + }): Promise>; + getItem(ids: Array): Promise>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.detail.server.data.ts new file mode 100644 index 0000000000..b048890e0c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.detail.server.data.ts @@ -0,0 +1,77 @@ +import { + CreatePartialViewRequestModel, + CreateScriptRequestModel, + CreateTextFileViewModelBaseModel, + PartialViewItemResponseModel, + ScriptResource, + ScriptResponseModel, + UpdatePartialViewRequestModel, + UpdateScriptRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { DataSourceResponse, UmbDataSource } from '@umbraco-cms/backoffice/repository'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +export class UmbScriptsServerDataSource + implements UmbDataSource +{ + #host: UmbControllerHostElement; + + constructor(host: UmbControllerHostElement) { + this.#host = host; + } + createScaffold( + parentId: string | null, + preset?: string | Partial | undefined, + ): Promise> { + throw new Error('Method not implemented.'); + } + + /** + * Fetches a partial view with the given path from the server + * @param {string} path + * @return {*} + * @memberof UmbStylesheetServerDataSource + */ + get(path: string): Promise> { + if (!path) throw new Error('Path is missing'); + return tryExecuteAndNotify(this.#host, ScriptResource.getScript({ path })); + } + /** + * Creates a new partial view + * + * @param {CreatePartialViewRequestModel} requestBody + * @return {*} {Promise>} + * @memberof UmbPartialViewDetailServerDataSource + */ + insert(requestBody: CreatePartialViewRequestModel): Promise> { + return tryExecuteAndNotify(this.#host, ScriptResource.postScript({ requestBody })); + } + + //TODO the parameters here are bit ugly, since unique is already in the request body parameter, but it has to be done to marry the UmbDataSource interface an backend API together... maybe come up with some nicer solution + /** + * Updates a partial view + * + * @param {string} [unique=''] + * @param {UpdatePartialViewRequestModel} requestBody + * @return {*} {Promise>} + * @memberof UmbPartialViewDetailServerDataSource + */ + update(unique = '', requestBody: UpdatePartialViewRequestModel): Promise> { + return tryExecuteAndNotify(this.#host, ScriptResource.putScript({ requestBody })); + } + /** + * Deletes a partial view + * + * @param {string} path + * @return {*} {Promise} + * @memberof UmbPartialViewDetailServerDataSource + */ + delete(path: string): Promise { + return tryExecuteAndNotify(this.#host, ScriptResource.deleteScript({ path })); + } + + getItems(keys: Array): Promise> { + return tryExecuteAndNotify(this.#host, ScriptResource.getScriptItem({ path: keys })); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.folder.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.folder.server.data.ts new file mode 100644 index 0000000000..a4a21add6a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.folder.server.data.ts @@ -0,0 +1,35 @@ +import { + CreateFolderRequestModel, + FolderModelBaseModel, + FolderResponseModel, + ScriptResource, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { DataSourceResponse, UmbFolderDataSource } from '@umbraco-cms/backoffice/repository'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +//! this is of any type in the backend-api +export type ScriptsGetFolderResponse = { path: string; parentPath: string; name: string }; + +export class UmbScriptsFolderServerDataSource implements UmbFolderDataSource { + #host: UmbControllerHostElement; + + constructor(host: UmbControllerHostElement) { + this.#host = host; + } + createScaffold(parentId: string | null): Promise> { + throw new Error('Method not implemented.'); + } + get(unique: string): Promise> { + return tryExecuteAndNotify(this.#host, ScriptResource.getScriptFolder({ path: unique })); + } + insert(requestBody: CreateFolderRequestModel): Promise> { + return tryExecuteAndNotify(this.#host, ScriptResource.postScriptFolder({ requestBody })); + } + update(unique: string, data: CreateFolderRequestModel): Promise> { + throw new Error('Method not implemented.'); + } + delete(path: string): Promise> { + return tryExecuteAndNotify(this.#host, ScriptResource.deleteScriptFolder({ path })); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.tree.server.data.ts new file mode 100644 index 0000000000..0014bec5f2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.tree.server.data.ts @@ -0,0 +1,54 @@ +import { ScriptsTreeDataSource } from './index.js'; +import { ScriptResource, ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +export class UmbScriptsTreeServerDataSource implements ScriptsTreeDataSource { + #host: UmbControllerHostElement; + + constructor(host: UmbControllerHostElement) { + this.#host = host; + } + + async getRootItems() { + return tryExecuteAndNotify(this.#host, ScriptResource.getTreeScriptRoot({})); + } + + async getChildrenOf({ + path, + skip, + take, + }: { + path?: string | undefined; + skip?: number | undefined; + take?: number | undefined; + }) { + if (!path) { + const error: ProblemDetails = { title: 'Path is missing' }; + return error; + } + + return tryExecuteAndNotify( + this.#host, + ScriptResource.getTreeScriptChildren({ + path, + skip, + take, + }), + ); + } + + async getItem(path: Array) { + if (!path) { + const error: ProblemDetails = { title: 'Paths are missing' }; + return error; + } + + return tryExecuteAndNotify( + this.#host, + ScriptResource.getScriptItem({ + path, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts new file mode 100644 index 0000000000..17d47fa936 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts @@ -0,0 +1,29 @@ +import { + SCRIPTS_ENTITY_TYPE, + SCRIPTS_REPOSITORY_ALIAS, + SCRIPTS_ROOT_ENTITY_TYPE, + SCRIPTS_TREE_ALIAS, +} from '../config.js'; +import type { ManifestTree, ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; + +const tree: ManifestTree = { + type: 'tree', + alias: SCRIPTS_TREE_ALIAS, + name: 'Scripts Tree', + weight: 30, + meta: { + repositoryAlias: SCRIPTS_REPOSITORY_ALIAS, + }, +}; + +const treeItem: ManifestTreeItem = { + type: 'treeItem', + kind: 'fileSystem', + alias: 'Umb.TreeItem.Scripts', + name: 'Scripts Tree Item', + meta: { + entityTypes: [SCRIPTS_ROOT_ENTITY_TYPE, SCRIPTS_ENTITY_TYPE], + }, +}; + +export const manifests = [tree, treeItem]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts new file mode 100644 index 0000000000..8102847ed0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts @@ -0,0 +1,35 @@ +import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; +import type { ManifestWorkspace, ManifestWorkspaceAction } from '@umbraco-cms/backoffice/extension-registry'; + +const workspace: ManifestWorkspace = { + type: 'workspace', + alias: 'Umb.Workspace.Scripts', + name: 'Partial View Workspace', + loader: () => import('./scripts-workspace.element.js'), + meta: { + entityType: 'partial-view', + }, +}; + +const workspaceActions: Array = [ + { + type: 'workspaceAction', + alias: 'Umb.WorkspaceAction.Scripts.Save', + name: 'Save Partial View', + weight: 70, + meta: { + look: 'primary', + color: 'positive', + label: 'Save', + api: UmbSaveWorkspaceAction, + }, + conditions: [ + { + alias: 'Umb.Condition.WorkspaceAlias', + match: workspace.alias, + }, + ], + }, +]; + +export const manifests = [workspace, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts new file mode 100644 index 0000000000..33e6570821 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts @@ -0,0 +1,171 @@ +import { UmbScriptsWorkspaceContext } from './scripts-workspace.context.js'; +import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; +import { UUITextStyles, UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; +import { css, html, customElement, query, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { Subject, debounceTime } from '@umbraco-cms/backoffice/external/rxjs'; +import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; + +@customElement('umb-scripts-workspace-edit') +export class UmbScriptsWorkspaceEditElement extends UmbLitElement { + #name: string | undefined = ''; + @state() + private get _name() { + return this.#name; + } + + private set _name(value) { + this.#name = value?.replace('.js', ''); + this.requestUpdate(); + } + + @state() + private _content?: string | null = ''; + + @state() + private _path?: string | null = ''; + + @state() + private _ready?: boolean = false; + + @query('umb-code-editor') + private _codeEditor?: UmbCodeEditorElement; + + #scriptsWorkspaceContext?: UmbScriptsWorkspaceContext; + private _modalContext?: UmbModalManagerContext; + + #isNew = false; + + private inputQuery$ = new Subject(); + + constructor() { + super(); + + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this._modalContext = instance; + }); + + this.consumeContext(UMB_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#scriptsWorkspaceContext = workspaceContext as UmbScriptsWorkspaceContext; + this.observe(this.#scriptsWorkspaceContext.name, (name) => { + this._name = name; + }); + + this.observe(this.#scriptsWorkspaceContext.content, (content) => { + this._content = content; + }); + + this.observe(this.#scriptsWorkspaceContext.path, (path) => { + this._path = path; + }); + + this.observe(this.#scriptsWorkspaceContext.isNew, (isNew) => { + this.#isNew = !!isNew; + }); + + this.observe(this.#scriptsWorkspaceContext.isCodeEditorReady, (isReady) => { + this._ready = isReady; + }); + + this.inputQuery$.pipe(debounceTime(250)).subscribe((nameInputValue: string) => { + this.#scriptsWorkspaceContext?.setName(`${nameInputValue}.cshtml`); + }); + }); + } + + #onNameInput(event: Event) { + const target = event.target as UUIInputElement; + const value = target.value as string; + this.inputQuery$.next(value); + } + + #onCodeEditorInput(event: Event) { + const target = event.target as UmbCodeEditorElement; + const value = target.code as string; + this.#scriptsWorkspaceContext?.setContent(value); + } + + #renderCodeEditor() { + return html``; + } + + render() { + return html` +
+ + Scripts/${this._path} +
+ + ${this._ready + ? this.#renderCodeEditor() + : html`
+ +
`} +
+
`; + } + + static styles = [ + UUITextStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + } + + #loader-container { + display: grid; + place-items: center; + min-height: calc(100dvh - 360px); + } + + umb-code-editor { + --editor-height: calc(100dvh - 300px); + } + + uui-box { + min-height: calc(100dvh - 300px); + margin: var(--uui-size-layout-1); + --uui-box-default-padding: 0; + /* remove header border bottom as code editor looks better in this box */ + --uui-color-divider-standalone: transparent; + } + + #workspace-header { + width: 100%; + } + + uui-input { + width: 100%; + } + + #code-editor-menu-container uui-icon:not([name='umb:delete']) { + margin-right: var(--uui-size-space-3); + } + + #code-editor-menu-container { + display: flex; + justify-content: flex-end; + gap: var(--uui-size-space-3); + } + `, + ]; +} + +export default UmbScriptsWorkspaceEditElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-scripts-workspace-edit': UmbScriptsWorkspaceEditElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts new file mode 100644 index 0000000000..8a37b4fe3e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts @@ -0,0 +1,97 @@ +import { ScriptDetails } from '../config.js'; +import { UmbScriptsRepository } from '../repository/scripts.repository.js'; +import { createObservablePart, UmbBooleanState, UmbDeepState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; +import { UpdatePartialViewRequestModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext { + getEntityId(): string | undefined { + return this.getData()?.path; + } + getEntityType(): string { + throw new Error('Method not implemented.'); + } + save(): Promise { + const script = this.getData(); + + if (!script) return Promise.reject('Something went wrong, there is no data for partial view you want to save...'); + if (this.getIsNew()) { + const createRequestBody = { + name: script.name, + content: script.content, + parentPath: script.path + '/', + }; + + this.repository.create(createRequestBody); + console.log('create'); + return Promise.resolve(); + } + if (!script.path) return Promise.reject('There is no path'); + const updateRequestBody: UpdatePartialViewRequestModel = { + name: script.name, + existingPath: script.path, + content: script.content, + }; + this.repository.save(script.path, updateRequestBody); + return Promise.resolve(); + } + destroy(): void { + throw new Error('Method not implemented.'); + } + #data = new UmbDeepState(undefined); + data = this.#data.asObservable(); + name = createObservablePart(this.#data, (data) => data?.name); + content = createObservablePart(this.#data, (data) => data?.content); + path = createObservablePart(this.#data, (data) => data?.path); + + #isCodeEditorReady = new UmbBooleanState(false); + isCodeEditorReady = this.#isCodeEditorReady.asObservable(); + + constructor(host: UmbControllerHostElement) { + super(host, 'Umb.Workspace.PartialViews', new UmbScriptsRepository(host)); + this.#loadCodeEditor(); + } + + async #loadCodeEditor() { + try { + await loadCodeEditor(); + this.#isCodeEditorReady.next(true); + } catch (error) { + console.error(error); + } + } + + getData() { + return this.#data.getValue(); + } + + setName(value: string) { + this.#data.next({ ...this.#data.value, name: value }); + } + + setContent(value: string) { + this.#data.next({ ...this.#data.value, content: value }); + } + + async load(entityKey: string) { + const { data } = await this.repository.requestByKey(entityKey); + if (data) { + this.setIsNew(false); + this.#data.next(data); + } + } + + async create(parentKey: string | null, name = 'Empty') { + const { data } = await this.repository.createScaffold(parentKey, name); + const newPartial = { + ...data, + name: '', + path: parentKey ?? '', + }; + if (!data) return; + this.setIsNew(true); + this.#data.next(newPartial); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts new file mode 100644 index 0000000000..0856337477 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts @@ -0,0 +1,58 @@ +import { UmbScriptsWorkspaceContext } from './scripts-workspace.context.js'; +import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbRoute, IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router'; + +import './scripts-workspace-edit.element.js'; + +import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; + +@customElement('umb-scripts-workspace') +export class UmbScriptsWorkspaceElement extends UmbLitElement { + #scriptsWorkspaceContext = new UmbScriptsWorkspaceContext(this); + + #element = document.createElement('umb-scripts-workspace-edit'); + + @state() + _routes: UmbRoute[] = [ + { + path: 'create/:parentKey', + component: () => this.#element, + setup: async (component: PageComponent, info: IRoutingInfo) => { + const parentKey = info.match.params.parentKey; + const decodePath = decodeURIComponent(parentKey); + this.#scriptsWorkspaceContext.create(decodePath === 'null' ? null : parentKey); + + new UmbWorkspaceIsNewRedirectController( + this, + this.#scriptsWorkspaceContext, + this.shadowRoot!.querySelector('umb-router-slot')!, + ); + }, + }, + { + path: 'edit/:key', + component: () => this.#element, + setup: (component: PageComponent, info: IRoutingInfo) => { + const key = info.match.params.key; + const decodePath = decodeURIComponent(key).replace('-js', '.js'); + this.#scriptsWorkspaceContext.load(decodePath); + }, + }, + ]; + + render() { + return html``; + } + + static styles = [UUITextStyles, css``]; +} + +export default UmbScriptsWorkspaceElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-scripts-workspace': UmbScriptsWorkspaceElement; + } +} From 0eb62cb0cb9f4c6235f5cc8120893a27f906834a Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:43:29 +0200 Subject: [PATCH 36/54] cleanup --- .../sources/scripts.detail.server.data.ts | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.detail.server.data.ts index b048890e0c..3ecf7f976e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/sources/scripts.detail.server.data.ts @@ -1,11 +1,9 @@ import { - CreatePartialViewRequestModel, CreateScriptRequestModel, CreateTextFileViewModelBaseModel, - PartialViewItemResponseModel, + ScriptItemResponseModel, ScriptResource, ScriptResponseModel, - UpdatePartialViewRequestModel, UpdateScriptRequestModel, } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -31,7 +29,7 @@ export class UmbScriptsServerDataSource * Fetches a partial view with the given path from the server * @param {string} path * @return {*} - * @memberof UmbStylesheetServerDataSource + * @memberof UmbScriptsDetailServerDataSource */ get(path: string): Promise> { if (!path) throw new Error('Path is missing'); @@ -40,11 +38,11 @@ export class UmbScriptsServerDataSource /** * Creates a new partial view * - * @param {CreatePartialViewRequestModel} requestBody + * @param {CreateScriptRequestModel} requestBody * @return {*} {Promise>} - * @memberof UmbPartialViewDetailServerDataSource + * @memberof UmbScriptsDetailServerDataSource */ - insert(requestBody: CreatePartialViewRequestModel): Promise> { + insert(requestBody: CreateScriptRequestModel): Promise> { return tryExecuteAndNotify(this.#host, ScriptResource.postScript({ requestBody })); } @@ -53,11 +51,11 @@ export class UmbScriptsServerDataSource * Updates a partial view * * @param {string} [unique=''] - * @param {UpdatePartialViewRequestModel} requestBody + * @param {UpdateScriptRequestModel} requestBody * @return {*} {Promise>} - * @memberof UmbPartialViewDetailServerDataSource + * @memberof UmbScriptsDetailServerDataSource */ - update(unique = '', requestBody: UpdatePartialViewRequestModel): Promise> { + update(unique = '', requestBody: UpdateScriptRequestModel): Promise> { return tryExecuteAndNotify(this.#host, ScriptResource.putScript({ requestBody })); } /** @@ -65,13 +63,13 @@ export class UmbScriptsServerDataSource * * @param {string} path * @return {*} {Promise} - * @memberof UmbPartialViewDetailServerDataSource + * @memberof UmbScriptsDetailServerDataSource */ delete(path: string): Promise { return tryExecuteAndNotify(this.#host, ScriptResource.deleteScript({ path })); } - getItems(keys: Array): Promise> { + getItems(keys: Array): Promise> { return tryExecuteAndNotify(this.#host, ScriptResource.getScriptItem({ path: keys })); } } From b769d9e77bbd7e1b49f1e6353d64ace28a554adc Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:16:01 +0200 Subject: [PATCH 37/54] add missing changes --- .../src/packages/templating/scripts/repository/manifests.ts | 5 ++++- .../templating/scripts/repository/scripts.tree.store.ts | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts index 3cdaeef6c5..70b8ed527c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts @@ -1,5 +1,8 @@ -import { ManifestRepository, ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extension-registry'; import { SCRIPTS_REPOSITORY_ALIAS } from '../config.js'; +import { UmbScriptsRepository } from './scripts.repository.js'; +import { UmbScriptsStore } from './scripts.store.js'; +import { UmbScriptsTreeStore } from './scripts.tree.store.js'; +import { ManifestRepository, ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extension-registry'; const repository: ManifestRepository = { type: 'repository', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts index c3a298f312..3b08222593 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts @@ -3,7 +3,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbFileSystemTreeStore } from '@umbraco-cms/backoffice/store'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( +export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN_ALIAS, ); @@ -14,7 +14,7 @@ export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken Date: Tue, 5 Sep 2023 13:15:01 +0200 Subject: [PATCH 38/54] cleanup --- .../src/packages/templating/scripts/config.ts | 8 +++++--- .../templating/scripts/repository/manifests.ts | 5 +---- .../scripts/repository/scripts.repository.ts | 14 ++++++-------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts index e534246dc5..d22c90f5fa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts @@ -8,8 +8,10 @@ export const SCRIPTS_FOLDER_ENTITY_TYPE = 'script-folder'; export const SCRIPTS_FOLDER_EMPTY_ENTITY_TYPE = 'script-folder-empty'; export const SCRIPTS_REPOSITORY_ALIAS = 'Umb.Repository.Scripts'; - export const SCRIPTS_TREE_ALIAS = 'Umb.Tree.Scripts'; -export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts.Tree'; -export const UMB_SCRIPTS_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts'; +export const SCRIPTS_STORE_ALIAS = 'Umb.Store.Scripts'; +export const SCRIPTS_TREE_STORE_ALIAS = 'Umb.Store.Scripts.Tree'; + +export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts.Tree.Context.Token'; +export const UMB_SCRIPTS_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts.Context.Token'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts index 70b8ed527c..7655a64cc3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts @@ -1,4 +1,4 @@ -import { SCRIPTS_REPOSITORY_ALIAS } from '../config.js'; +import { SCRIPTS_REPOSITORY_ALIAS, SCRIPTS_STORE_ALIAS, SCRIPTS_TREE_STORE_ALIAS } from '../config.js'; import { UmbScriptsRepository } from './scripts.repository.js'; import { UmbScriptsStore } from './scripts.store.js'; import { UmbScriptsTreeStore } from './scripts.tree.store.js'; @@ -11,9 +11,6 @@ const repository: ManifestRepository = { class: UmbScriptsRepository, }; -export const SCRIPTS_STORE_ALIAS = 'Umb.Store.PartialViews'; -export const SCRIPTS_TREE_STORE_ALIAS = 'Umb.Store.PartialViewsTree'; - const store: ManifestStore = { type: 'store', alias: SCRIPTS_STORE_ALIAS, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts index dc666c21ed..f6db52f6e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts @@ -1,10 +1,7 @@ -import { PARTIAL_VIEW_ROOT_ENTITY_TYPE } from '../../partial-views/config.js'; -import { UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT_TOKEN } from '../../partial-views/repository/partial-views.tree.store.js'; -import { PartialViewGetFolderResponse } from '../../partial-views/repository/sources/partial-views.folder.server.data.js'; import { UmbScriptsTreeServerDataSource } from './sources/scripts.tree.server.data.js'; import { UmbScriptsServerDataSource } from './sources/scripts.detail.server.data.js'; -import { UmbScriptsFolderServerDataSource } from './sources/scripts.folder.server.data.js'; -import { UmbScriptsTreeStore } from './scripts.tree.store.js'; +import { ScriptsGetFolderResponse, UmbScriptsFolderServerDataSource } from './sources/scripts.folder.server.data.js'; +import { UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN, UmbScriptsTreeStore } from './scripts.tree.store.js'; import { DataSourceResponse, UmbDataSourceErrorResponse, @@ -27,6 +24,7 @@ import { import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import { SCRIPTS_ROOT_ENTITY_TYPE } from '../config.js'; export class UmbScriptsRepository implements @@ -51,7 +49,7 @@ export class UmbScriptsRepository this.#folderDataSource = new UmbScriptsFolderServerDataSource(this.#host); this.#init = Promise.all([ - new UmbContextConsumerController(this.#host, UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(this.#host, UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN, (instance) => { this.#treeStore = instance; }), ]); @@ -82,7 +80,7 @@ export class UmbScriptsRepository } async requestFolder( unique: string, - ): Promise<{ data?: PartialViewGetFolderResponse | undefined; error?: ProblemDetails | undefined }> { + ): Promise<{ data?: ScriptsGetFolderResponse | undefined; error?: ProblemDetails | undefined }> { await this.#init; return this.#folderDataSource.get(unique); } @@ -110,7 +108,7 @@ export class UmbScriptsRepository const data = { id: null, path: null, - type: PARTIAL_VIEW_ROOT_ENTITY_TYPE, + type: SCRIPTS_ROOT_ENTITY_TYPE, name: 'Partial Views', icon: 'umb:folder', hasChildren: true, From 2128877c6b7e9c82997e17e045a44f8bf913f125 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 6 Sep 2023 11:52:07 +0200 Subject: [PATCH 39/54] register handlers --- src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts | 2 ++ src/Umbraco.Web.UI.Client/src/packages/templating/manifests.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts index a477b869cc..6af78c329c 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -31,6 +31,7 @@ import { handlers as stylesheetHandlers } from './handlers/stylesheet.handlers.j import { handlers as partialViewsHandlers } from './handlers/partial-views.handlers.js'; import { handlers as tagHandlers } from './handlers/tag-handlers.js'; import { handlers as configHandlers } from './handlers/config.handlers.js'; +import { handlers as scriptHandlers } from './handlers/scripts.handlers.js'; const handlers = [ serverHandlers.serverVersionHandler, @@ -65,6 +66,7 @@ const handlers = [ ...partialViewsHandlers, ...tagHandlers, ...configHandlers, + ...scriptHandlers, ]; switch (import.meta.env.VITE_UMBRACO_INSTALL_STATUS) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/manifests.ts index 158a216974..4e83ef08d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/manifests.ts @@ -2,6 +2,7 @@ import { manifests as menuManifests } from './menu.manifests.js'; import { manifests as templateManifests } from './templates/manifests.js'; import { manifests as stylesheetManifests } from './stylesheets/manifests.js'; import { manifests as partialManifests } from './partial-views/manifests.js'; +import { manifests as scriptsManifest } from './scripts/manifests.js'; import { manifests as modalManifests } from './modals/manifests.js'; export const manifests = [ @@ -10,4 +11,5 @@ export const manifests = [ ...stylesheetManifests, ...partialManifests, ...modalManifests, + ...scriptsManifest, ]; From 58d812657e7ef15369cd6c2964e720c4e5d8aa6f Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:56:28 +0200 Subject: [PATCH 40/54] fix naming and weight --- .../src/packages/templating/scripts/menu-item/manifests.ts | 2 +- .../templating/scripts/repository/scripts.repository.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts index 1459ef62ff..79bb245805 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts @@ -6,7 +6,7 @@ const menuItem: ManifestTypes = { kind: 'tree', alias: 'Umb.MenuItem.Scripts', name: 'Scripts Menu Item', - weight: 40, + weight: 10, meta: { label: 'Scripts', icon: 'umb:folder', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts index f6db52f6e0..fd2a6af551 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts @@ -109,7 +109,7 @@ export class UmbScriptsRepository id: null, path: null, type: SCRIPTS_ROOT_ENTITY_TYPE, - name: 'Partial Views', + name: 'Scripts', icon: 'umb:folder', hasChildren: true, }; From b343f2d1946dafdf87969e69578cc9500fb475a4 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:57:56 +0200 Subject: [PATCH 41/54] show workspace --- .../packages/templating/scripts/workspace/manifests.ts | 7 ++++--- .../scripts/workspace/scripts-workspace.element.ts | 10 ++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts index 8102847ed0..f95ee3265d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts @@ -1,13 +1,14 @@ +import { SCRIPTS_ENTITY_TYPE } from '../config.js'; import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction } from '@umbraco-cms/backoffice/extension-registry'; const workspace: ManifestWorkspace = { type: 'workspace', alias: 'Umb.Workspace.Scripts', - name: 'Partial View Workspace', + name: 'Scripts Workspace', loader: () => import('./scripts-workspace.element.js'), meta: { - entityType: 'partial-view', + entityType: SCRIPTS_ENTITY_TYPE, }, }; @@ -15,7 +16,7 @@ const workspaceActions: Array = [ { type: 'workspaceAction', alias: 'Umb.WorkspaceAction.Scripts.Save', - name: 'Save Partial View', + name: 'Save Scripts Workspace Action', weight: 70, meta: { look: 'primary', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts index 0856337477..61524d6002 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts @@ -3,22 +3,16 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbRoute, IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/router'; - -import './scripts-workspace-edit.element.js'; - import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; @customElement('umb-scripts-workspace') export class UmbScriptsWorkspaceElement extends UmbLitElement { #scriptsWorkspaceContext = new UmbScriptsWorkspaceContext(this); - - #element = document.createElement('umb-scripts-workspace-edit'); - @state() _routes: UmbRoute[] = [ { path: 'create/:parentKey', - component: () => this.#element, + component: import('./scripts-workspace-edit.element.js'), setup: async (component: PageComponent, info: IRoutingInfo) => { const parentKey = info.match.params.parentKey; const decodePath = decodeURIComponent(parentKey); @@ -33,7 +27,7 @@ export class UmbScriptsWorkspaceElement extends UmbLitElement { }, { path: 'edit/:key', - component: () => this.#element, + component: import('./scripts-workspace-edit.element.js'), setup: (component: PageComponent, info: IRoutingInfo) => { const key = info.match.params.key; const decodePath = decodeURIComponent(key).replace('-js', '.js'); From 863372a995c7e7db7e346f1bf183f3a8829b712f Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 6 Sep 2023 13:04:43 +0200 Subject: [PATCH 42/54] update naming --- .../scripts/entity-actions/manifests.ts | 14 +++++++------- .../templating/scripts/repository/manifests.ts | 6 +++--- .../scripts/repository/scripts.store.ts | 16 ++++++++-------- .../scripts/repository/scripts.tree.store.ts | 8 ++++---- .../sources/scripts.detail.server.data.ts | 8 ++++---- .../workspace/scripts-workspace.context.ts | 12 ++++++------ 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts index 5de72e500f..a73e04f251 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts @@ -16,8 +16,8 @@ import { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry const scriptsViewActions: Array = [ { type: 'entityAction', - alias: 'Umb.EntityAction.PartialView.Delete', - name: 'Delete PartialView Entity Action', + alias: 'Umb.EntityAction.Scripts.Delete', + name: 'Delete Scripts Entity Action', meta: { icon: 'umb:trash', label: 'Delete', @@ -31,11 +31,11 @@ const scriptsViewActions: Array = [ const scriptsFolderActions: Array = [ { type: 'entityAction', - alias: 'Umb.EntityAction.PartialViewFolder.Create.New', - name: 'Create PartialView Entity Under Directory Action', + alias: 'Umb.EntityAction.ScriptsFolder.Create.New', + name: 'Create Scripts Entity Under Directory Action', meta: { icon: 'umb:article', - label: 'New empty partial view', + label: 'New empty script', api: UmbCreateScriptAction, repositoryAlias: SCRIPTS_REPOSITORY_ALIAS, entityTypes: [SCRIPTS_FOLDER_ENTITY_TYPE, SCRIPTS_ROOT_ENTITY_TYPE], @@ -43,7 +43,7 @@ const scriptsFolderActions: Array = [ }, { type: 'entityAction', - alias: 'Umb.EntityAction.PartialViewFolder.DeleteFolder', + alias: 'Umb.EntityAction.ScriptsFolder.DeleteFolder', name: 'Remove empty folder', meta: { icon: 'umb:trash', @@ -55,7 +55,7 @@ const scriptsFolderActions: Array = [ }, { type: 'entityAction', - alias: 'Umb.EntityAction.PartialViewFolder.CreateFolder', + alias: 'Umb.EntityAction.ScriptsFolder.CreateFolder', name: 'Create empty folder', meta: { icon: 'umb:add', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts index 7655a64cc3..b0e43e0483 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/manifests.ts @@ -7,21 +7,21 @@ import { ManifestRepository, ManifestStore, ManifestTreeStore } from '@umbraco-c const repository: ManifestRepository = { type: 'repository', alias: SCRIPTS_REPOSITORY_ALIAS, - name: 'Partial Views Repository', + name: 'Scripts Repository', class: UmbScriptsRepository, }; const store: ManifestStore = { type: 'store', alias: SCRIPTS_STORE_ALIAS, - name: 'Partial Views Store', + name: 'Scripts Store', class: UmbScriptsStore, }; const treeStore: ManifestTreeStore = { type: 'treeStore', alias: SCRIPTS_TREE_STORE_ALIAS, - name: 'Partial Views Tree Store', + name: 'Scripts Tree Store', class: UmbScriptsTreeStore, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.store.ts index 2f6a97972f..43285510f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.store.ts @@ -7,33 +7,33 @@ import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api /** * @export - * @class UmbPartialViewsStore + * @class UmbScriptsStore * @extends {UmbStoreBase} - * @description - Data Store for partial views + * @description - Data Store for scripts */ export class UmbScriptsStore extends UmbStoreBase { /** - * Creates an instance of UmbPartialViewsStore. + * Creates an instance of UmbScriptsStore. * @param {UmbControllerHostInterface} host - * @memberof UmbPartialViewsStore + * @memberof UmbScriptsStore */ constructor(host: UmbControllerHostElement) { super(host, UMB_SCRIPTS_STORE_CONTEXT_TOKEN.toString(), new UmbArrayState([], (x) => x.id)); } /** - * Append a partial view to the store + * Append a script to the store * @param {Template} template - * @memberof UmbPartialViewsStore + * @memberof UmbScriptsStore */ append(template: TemplateResponseModel) { this._data.append([template]); } /** - * Removes partial views in the store with the given uniques + * Removes scripts in the store with the given uniques * @param {string[]} uniques - * @memberof UmbPartialViewsStore + * @memberof UmbScriptsStore */ remove(uniques: string[]) { this._data.remove(uniques); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts index 3b08222593..3dd1fe2461 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.tree.store.ts @@ -8,17 +8,17 @@ export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken>} @@ -48,7 +48,7 @@ export class UmbScriptsServerDataSource //TODO the parameters here are bit ugly, since unique is already in the request body parameter, but it has to be done to marry the UmbDataSource interface an backend API together... maybe come up with some nicer solution /** - * Updates a partial view + * Updates a script * * @param {string} [unique=''] * @param {UpdateScriptRequestModel} requestBody @@ -59,7 +59,7 @@ export class UmbScriptsServerDataSource return tryExecuteAndNotify(this.#host, ScriptResource.putScript({ requestBody })); } /** - * Deletes a partial view + * Deletes a script * * @param {string} path * @return {*} {Promise} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts index 8a37b4fe3e..d4dbea94d6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts @@ -4,7 +4,7 @@ import { createObservablePart, UmbBooleanState, UmbDeepState } from '@umbraco-cm import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; -import { UpdatePartialViewRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { UpdateScriptRequestModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext { getEntityId(): string | undefined { @@ -16,7 +16,7 @@ export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext { const script = this.getData(); - if (!script) return Promise.reject('Something went wrong, there is no data for partial view you want to save...'); + if (!script) return Promise.reject('Something went wrong, there is no data for script view you want to save...'); if (this.getIsNew()) { const createRequestBody = { name: script.name, @@ -29,7 +29,7 @@ export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext Date: Wed, 6 Sep 2023 13:17:44 +0200 Subject: [PATCH 43/54] cleanup --- .../src/packages/templating/scripts/config.ts | 27 +++++++++++++++---- .../scripts/entity-actions/manifests.ts | 12 ++++++--- .../src/packages/templating/scripts/index.ts | 1 + .../templating/scripts/menu-item/manifests.ts | 4 +-- .../scripts/repository/scripts.repository.ts | 2 +- .../templating/scripts/tree/manifests.ts | 3 ++- .../templating/scripts/workspace/manifests.ts | 6 ++--- 7 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts index d22c90f5fa..1cdd3d28da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/config.ts @@ -2,16 +2,33 @@ import { ScriptResponseModel } from '@umbraco-cms/backoffice/backend-api'; export type ScriptDetails = ScriptResponseModel; +//ENTITY TYPES export const SCRIPTS_ENTITY_TYPE = 'script'; export const SCRIPTS_ROOT_ENTITY_TYPE = 'script-root'; export const SCRIPTS_FOLDER_ENTITY_TYPE = 'script-folder'; export const SCRIPTS_FOLDER_EMPTY_ENTITY_TYPE = 'script-folder-empty'; -export const SCRIPTS_REPOSITORY_ALIAS = 'Umb.Repository.Scripts'; -export const SCRIPTS_TREE_ALIAS = 'Umb.Tree.Scripts'; export const SCRIPTS_STORE_ALIAS = 'Umb.Store.Scripts'; -export const SCRIPTS_TREE_STORE_ALIAS = 'Umb.Store.Scripts.Tree'; - -export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts.Tree.Context.Token'; export const UMB_SCRIPTS_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts.Context.Token'; + +export const SCRIPTS_REPOSITORY_ALIAS = 'Umb.Repository.Scripts'; + +export const SCRIPTS_MENU_ITEM_ALIAS = 'Umb.MenuItem.Scripts'; + +//TREE +export const SCRIPTS_TREE_ALIAS = 'Umb.Tree.Scripts'; +export const SCRIPTS_TREE_ITEM_ALIAS = 'Umb.TreeItem.Scripts'; +export const SCRIPTS_TREE_STORE_ALIAS = 'Umb.Store.Scripts.Tree'; +export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN_ALIAS = 'Umb.Store.Scripts.Tree.Context.Token'; + +//ENTITY (tree) ACTIONS +export const SCRIPTS_ENTITY_ACTION_DELETE_ALIAS = 'Umb.EntityAction.Scripts.Delete'; +export const SCRIPTS_ENTITY_ACTION_CREATE_NEW_ALIAS = 'Umb.EntityAction.ScriptsFolder.Create.New'; +export const SCRIPTS_ENTITY_ACTION_DELETE_FOLDER_ALIAS = 'Umb.EntityAction.ScriptsFolder.DeleteFolder'; +export const SCRIPTS_ENTITY_ACTION_CREATE_FOLDER_NEW_ALIAS = 'Umb.EntityAction.ScriptsFolder.CreateFolder'; + +//WORKSPACE +export const SCRIPTS_WORKSPACE_ALIAS = 'Umb.Workspace.Scripts'; +export const SCRIPTS_WORKSPACE_ACTION_SAVE_ALIAS = 'Umb.WorkspaceAction.Scripts.Save'; + diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts index a73e04f251..0d135d6559 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts @@ -4,6 +4,10 @@ import { SCRIPTS_FOLDER_ENTITY_TYPE, SCRIPTS_ROOT_ENTITY_TYPE, SCRIPTS_FOLDER_EMPTY_ENTITY_TYPE, + SCRIPTS_ENTITY_ACTION_DELETE_ALIAS, + SCRIPTS_ENTITY_ACTION_CREATE_NEW_ALIAS, + SCRIPTS_ENTITY_ACTION_DELETE_FOLDER_ALIAS, + SCRIPTS_ENTITY_ACTION_CREATE_FOLDER_NEW_ALIAS, } from '../config.js'; import { UmbCreateScriptAction } from './create/create-empty.action.js'; import { @@ -16,7 +20,7 @@ import { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry const scriptsViewActions: Array = [ { type: 'entityAction', - alias: 'Umb.EntityAction.Scripts.Delete', + alias: SCRIPTS_ENTITY_ACTION_DELETE_ALIAS, name: 'Delete Scripts Entity Action', meta: { icon: 'umb:trash', @@ -31,7 +35,7 @@ const scriptsViewActions: Array = [ const scriptsFolderActions: Array = [ { type: 'entityAction', - alias: 'Umb.EntityAction.ScriptsFolder.Create.New', + alias: SCRIPTS_ENTITY_ACTION_CREATE_NEW_ALIAS, name: 'Create Scripts Entity Under Directory Action', meta: { icon: 'umb:article', @@ -43,7 +47,7 @@ const scriptsFolderActions: Array = [ }, { type: 'entityAction', - alias: 'Umb.EntityAction.ScriptsFolder.DeleteFolder', + alias: SCRIPTS_ENTITY_ACTION_DELETE_FOLDER_ALIAS, name: 'Remove empty folder', meta: { icon: 'umb:trash', @@ -55,7 +59,7 @@ const scriptsFolderActions: Array = [ }, { type: 'entityAction', - alias: 'Umb.EntityAction.ScriptsFolder.CreateFolder', + alias: SCRIPTS_ENTITY_ACTION_CREATE_FOLDER_NEW_ALIAS, name: 'Create empty folder', meta: { icon: 'umb:add', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts index 3d76f338dd..5b27938d26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/index.ts @@ -1 +1,2 @@ export * from './repository/index.js'; +export * from './config.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts index 79bb245805..2b6d95347a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/menu-item/manifests.ts @@ -1,10 +1,10 @@ -import { SCRIPTS_ENTITY_TYPE, SCRIPTS_TREE_ALIAS } from '../config.js'; +import { SCRIPTS_ENTITY_TYPE, SCRIPTS_MENU_ITEM_ALIAS, SCRIPTS_TREE_ALIAS } from '../config.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestTypes = { type: 'menuItem', kind: 'tree', - alias: 'Umb.MenuItem.Scripts', + alias: SCRIPTS_MENU_ITEM_ALIAS, name: 'Scripts Menu Item', weight: 10, meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts index fd2a6af551..77593ecc70 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts @@ -1,3 +1,4 @@ +import { SCRIPTS_ROOT_ENTITY_TYPE } from '../config.js'; import { UmbScriptsTreeServerDataSource } from './sources/scripts.tree.server.data.js'; import { UmbScriptsServerDataSource } from './sources/scripts.detail.server.data.js'; import { ScriptsGetFolderResponse, UmbScriptsFolderServerDataSource } from './sources/scripts.folder.server.data.js'; @@ -24,7 +25,6 @@ import { import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { SCRIPTS_ROOT_ENTITY_TYPE } from '../config.js'; export class UmbScriptsRepository implements diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts index 17d47fa936..dbb150e860 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts @@ -3,6 +3,7 @@ import { SCRIPTS_REPOSITORY_ALIAS, SCRIPTS_ROOT_ENTITY_TYPE, SCRIPTS_TREE_ALIAS, + SCRIPTS_TREE_ITEM_ALIAS, } from '../config.js'; import type { ManifestTree, ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; @@ -19,7 +20,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', kind: 'fileSystem', - alias: 'Umb.TreeItem.Scripts', + alias: SCRIPTS_TREE_ITEM_ALIAS, name: 'Scripts Tree Item', meta: { entityTypes: [SCRIPTS_ROOT_ENTITY_TYPE, SCRIPTS_ENTITY_TYPE], diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts index f95ee3265d..7ec5767d92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts @@ -1,10 +1,10 @@ -import { SCRIPTS_ENTITY_TYPE } from '../config.js'; +import { SCRIPTS_ENTITY_TYPE, SCRIPTS_WORKSPACE_ACTION_SAVE_ALIAS, SCRIPTS_WORKSPACE_ALIAS } from '../config.js'; import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction } from '@umbraco-cms/backoffice/extension-registry'; const workspace: ManifestWorkspace = { type: 'workspace', - alias: 'Umb.Workspace.Scripts', + alias: SCRIPTS_WORKSPACE_ALIAS, name: 'Scripts Workspace', loader: () => import('./scripts-workspace.element.js'), meta: { @@ -15,7 +15,7 @@ const workspace: ManifestWorkspace = { const workspaceActions: Array = [ { type: 'workspaceAction', - alias: 'Umb.WorkspaceAction.Scripts.Save', + alias: SCRIPTS_WORKSPACE_ACTION_SAVE_ALIAS, name: 'Save Scripts Workspace Action', weight: 70, meta: { From f5957b56076d78495f799fef30243fe1c2838c39 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 6 Sep 2023 13:19:29 +0200 Subject: [PATCH 44/54] correct language --- .../scripts/workspace/scripts-workspace-edit.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts index 33e6570821..22256ff2bd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts @@ -69,7 +69,7 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { }); this.inputQuery$.pipe(debounceTime(250)).subscribe((nameInputValue: string) => { - this.#scriptsWorkspaceContext?.setName(`${nameInputValue}.cshtml`); + this.#scriptsWorkspaceContext?.setName(`${nameInputValue}.js`); }); }); } @@ -88,14 +88,14 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { #renderCodeEditor() { return html``; } render() { - return html` + return html`
Date: Wed, 6 Sep 2023 13:24:36 +0200 Subject: [PATCH 45/54] fix styling error --- .../workspace/scripts-workspace-edit.element.ts | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts index 22256ff2bd..d2972ce548 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts @@ -105,6 +105,8 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { Scripts/${this._path}
+ +
${this._ready ? this.#renderCodeEditor() : html`
@@ -120,13 +122,12 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { :host { display: block; width: 100%; - height: 100%; } #loader-container { display: grid; place-items: center; - min-height: calc(100dvh - 360px); + min-height: calc(100dvh - 300px); } umb-code-editor { @@ -134,7 +135,7 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { } uui-box { - min-height: calc(100dvh - 300px); + min-height: calc(100dvh - 360px); margin: var(--uui-size-layout-1); --uui-box-default-padding: 0; /* remove header border bottom as code editor looks better in this box */ @@ -148,16 +149,6 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { uui-input { width: 100%; } - - #code-editor-menu-container uui-icon:not([name='umb:delete']) { - margin-right: var(--uui-size-space-3); - } - - #code-editor-menu-container { - display: flex; - justify-content: flex-end; - gap: var(--uui-size-space-3); - } `, ]; } From 193d550a562eb5639b3e36e849cbc3d592a2a6f0 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 6 Sep 2023 13:30:33 +0200 Subject: [PATCH 46/54] fix code editor height --- .../scripts/workspace/scripts-workspace-edit.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts index d2972ce548..e2d493b9e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts @@ -127,7 +127,7 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { #loader-container { display: grid; place-items: center; - min-height: calc(100dvh - 300px); + min-height: calc(100dvh - 230px); } umb-code-editor { @@ -135,7 +135,7 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { } uui-box { - min-height: calc(100dvh - 360px); + min-height: calc(100dvh - 230px); margin: var(--uui-size-layout-1); --uui-box-default-padding: 0; /* remove header border bottom as code editor looks better in this box */ From 9ac9df7f0801d0d13d4cf93a5fc201fd3bca7059 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 6 Sep 2023 13:35:15 +0200 Subject: [PATCH 47/54] cleanup --- .../src/packages/templating/scripts/workspace/manifests.ts | 2 +- .../scripts/workspace/scripts-workspace-edit.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts index 7ec5767d92..25f16bb705 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts @@ -27,7 +27,7 @@ const workspaceActions: Array = [ conditions: [ { alias: 'Umb.Condition.WorkspaceAlias', - match: workspace.alias, + match: SCRIPTS_WORKSPACE_ALIAS, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts index e2d493b9e0..53177e8713 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts @@ -131,7 +131,7 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { } umb-code-editor { - --editor-height: calc(100dvh - 300px); + --editor-height: calc(100dvh - 230px); } uui-box { From c37608b429032f77b17ded1c059c8a1e1f1223ad Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Wed, 6 Sep 2023 16:38:27 +0200 Subject: [PATCH 48/54] correct the alias --- .../src/mocks/data/scripts.data.ts | 84 +++++++++++++------ .../src/mocks/handlers/scripts.handlers.ts | 12 +-- .../templating/scripts/workspace/manifests.ts | 10 +-- .../scripts-workspace-edit.element.ts | 19 ++++- .../workspace/scripts-workspace.context.ts | 74 ++++++++-------- 5 files changed, 123 insertions(+), 76 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts index 74016f97fc..9803695a1b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts @@ -1,3 +1,4 @@ +import { UmbData } from './data.js'; import { UmbEntityData } from './entity.data.js'; import { createFileSystemTreeItem, createTextFileItem } from './utils.js'; import { @@ -6,13 +7,13 @@ import { FileSystemTreeItemPresentationModel, PagedFileSystemTreeItemPresentationModel, ScriptResponseModel, + UpdateScriptRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -type ScriptsDataItem = ScriptResponseModel & FileSystemTreeItemPresentationModel & { id: string }; +type ScriptsDataItem = ScriptResponseModel & FileSystemTreeItemPresentationModel; export const data: Array = [ { - id: 'some-folder', path: 'some-folder', isFolder: true, name: 'some-folder', @@ -20,7 +21,6 @@ export const data: Array = [ hasChildren: true, }, { - id: 'another-folder', path: 'another-folder', isFolder: true, name: 'another-folder', @@ -28,7 +28,6 @@ export const data: Array = [ hasChildren: true, }, { - id: 'very important folder', path: 'very important folder', isFolder: true, name: 'very important folder', @@ -36,7 +35,6 @@ export const data: Array = [ hasChildren: true, }, { - id: 'some-folder/ugly script.js', path: 'some-folder/ugly script.js', isFolder: false, name: 'ugly script.js', @@ -55,7 +53,6 @@ export const data: Array = [ console.log(makeid(5));`, }, { - id: 'some-folder/nice script.js', path: 'some-folder/nice script.js', isFolder: false, name: 'nice script.js', @@ -71,7 +68,6 @@ export const data: Array = [ }`, }, { - id: 'another-folder/only bugs.js', path: 'another-folder/only bugs.js', isFolder: false, name: 'only bugs.js', @@ -84,7 +80,6 @@ export const data: Array = [ console.log(my_arr);`, }, { - id: 'very important folder/no bugs at all.js', path: 'very important folder/no bugs at all.js', isFolder: false, name: 'no bugs at all.js', @@ -100,7 +95,6 @@ export const data: Array = [ // -> TO get the short day name e.g. Tue`, }, { - id: 'very important folder/nope.js', path: 'very important folder/nope.js', isFolder: false, name: 'nope.js', @@ -120,7 +114,7 @@ export const data: Array = [ }, ]; -class UmbScriptsTreeData extends UmbEntityData { +class UmbScriptsData extends UmbData { constructor() { super(data); } @@ -143,12 +137,6 @@ class UmbScriptsTreeData extends UmbEntityData paths.includes(item.path ?? '')); return items.map((item) => createFileSystemTreeItem(item)); } -} - -class UmbScriptsFolderData extends UmbEntityData { - constructor() { - super(data); - } getFolder(path: string): FileSystemTreeItemPresentationModel { const items = data.filter((item) => item.isFolder && item.path === path); @@ -157,7 +145,6 @@ class UmbScriptsFolderData extends UmbEntityData { postFolder(payload: CreatePathFolderRequestModel) { const newFolder = { - id: `${payload.parentPath ?? ''}/${payload.name}`, path: `${payload.parentPath ?? ''}/${payload.name}`, isFolder: true, name: payload.name, @@ -170,15 +157,6 @@ class UmbScriptsFolderData extends UmbEntityData { deleteFolder(path: string) { return this.delete([path]); } -} - -export const umbScriptsTreeData = new UmbScriptsTreeData(); -export const umbScriptsFolderData = new UmbScriptsFolderData(); - -class UmbScriptsData extends UmbEntityData { - constructor() { - super(data); - } getScript(path: string): ScriptResponseModel | undefined { return createTextFileItem(this.data.find((item) => item.path === path)); @@ -188,7 +166,6 @@ class UmbScriptsData extends UmbEntityData { const newItem: ScriptsDataItem = { ...item, path: `${item.parentPath}/${item.name}.js}`, - id: `${item.parentPath}/${item.name}.js}`, isFolder: false, hasChildren: false, type: 'script', @@ -197,6 +174,59 @@ class UmbScriptsData extends UmbEntityData { this.insert(newItem); return newItem; } + + insert(item: ScriptsDataItem) { + const exits = this.data.find((i) => i.path === item.path); + + if (exits) { + throw new Error(`Item with path ${item.path} already exists`); + } + + this.data.push(item); + + return item; + } + + updateData(updateItem: UpdateScriptRequestModel) { + const itemIndex = this.data.findIndex((item) => item.path === updateItem.existingPath); + const item = this.data[itemIndex]; + if (!item) return; + + // TODO: revisit this code, seems like something we can solve smarter/type safer now: + const itemKeys = Object.keys(item); + const newItem = { ...item }; + + for (const [key] of Object.entries(updateItem)) { + if (itemKeys.indexOf(key) !== -1) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + newItem[key] = updateItem[key]; + } + } + // Specific to fileSystem, we need to update path based on name: + const dirName = updateItem.existingPath?.substring(0, updateItem.existingPath.lastIndexOf('/')); + newItem.path = `${dirName}${dirName ? '/' : ''}${updateItem.name}`; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this.data[itemIndex] = newItem; + } + + delete(paths: Array) { + const deletedPaths = this.data + .filter((item) => { + if (!item.path) throw new Error('Item has no path'); + paths.includes(item.path); + }) + .map((item) => item.path); + + this.data = this.data.filter((item) => { + if (!item.path) throw new Error('Item has no path'); + paths.indexOf(item.path) === -1; + }); + + return deletedPaths; + } } export const umbScriptsData = new UmbScriptsData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts index 0ed02833d8..819b83a4ae 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts @@ -1,12 +1,12 @@ const { rest } = window.MockServiceWorker; import { RestHandler, MockedRequest, DefaultBodyType } from 'msw'; -import { umbScriptsTreeData, umbScriptsData, umbScriptsFolderData } from '../data/scripts.data.js'; +import { umbScriptsData } from '../data/scripts.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import { CreatePathFolderRequestModel, CreateTextFileViewModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; const treeHandlers = [ rest.get(umbracoPath('/tree/script/root'), (req, res, ctx) => { - const response = umbScriptsTreeData.getTreeRoot(); + const response = umbScriptsData.getTreeRoot(); return res(ctx.status(200), ctx.json(response)); }), @@ -14,7 +14,7 @@ const treeHandlers = [ const path = req.url.searchParams.get('path'); if (!path) return; - const response = umbScriptsTreeData.getTreeItemChildren(path); + const response = umbScriptsData.getTreeItemChildren(path); return res(ctx.status(200), ctx.json(response)); }), @@ -22,7 +22,7 @@ const treeHandlers = [ const paths = req.url.searchParams.getAll('paths'); if (!paths) return; - const items = umbScriptsTreeData.getTreeItem(paths); + const items = umbScriptsData.getTreeItem(paths); return res(ctx.status(200), ctx.json(items)); }), ]; @@ -59,7 +59,7 @@ const folderHandlers: RestHandler>[] = [ rest.get(umbracoPath('script/folder'), (req, res, ctx) => { const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); if (!path) return res(ctx.status(400)); - const response = umbScriptsFolderData.getFolder(path); + const response = umbScriptsData.getFolder(path); return res(ctx.status(200), ctx.json(response)); }), rest.post(umbracoPath('script/folder'), (req, res, ctx) => { @@ -70,7 +70,7 @@ const folderHandlers: RestHandler>[] = [ rest.delete(umbracoPath('script/folder'), (req, res, ctx) => { const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); if (!path) return res(ctx.status(400)); - const response = umbScriptsFolderData.deleteFolder(path); + const response = umbScriptsData.deleteFolder(path); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts index 25f16bb705..580cf9eef4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts @@ -12,22 +12,22 @@ const workspace: ManifestWorkspace = { }, }; +//TODO: this does not work for some reason const workspaceActions: Array = [ { type: 'workspaceAction', - alias: SCRIPTS_WORKSPACE_ACTION_SAVE_ALIAS, - name: 'Save Scripts Workspace Action', - weight: 70, + alias: 'Umb.WorkspaceAction.Scripts.Save', + name: 'Save Script Workspace Action', meta: { + label: 'Save', look: 'primary', color: 'positive', - label: 'Save', api: UmbSaveWorkspaceAction, }, conditions: [ { alias: 'Umb.Condition.WorkspaceAlias', - match: SCRIPTS_WORKSPACE_ALIAS, + match: workspace.alias, }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts index 53177e8713..6ec39342e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts @@ -113,6 +113,19 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement {
`}
+
+ + + Keyboard Shortcuts + + ALT + + + shift + + + k + + +
`; } @@ -127,15 +140,15 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { #loader-container { display: grid; place-items: center; - min-height: calc(100dvh - 230px); + min-height: calc(100dvh - 260px); } umb-code-editor { - --editor-height: calc(100dvh - 230px); + --editor-height: calc(100dvh - 260px); } uui-box { - min-height: calc(100dvh - 230px); + min-height: calc(100dvh - 260px); margin: var(--uui-size-layout-1); --uui-box-default-padding: 0; /* remove header border bottom as code editor looks better in this box */ diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts index d4dbea94d6..5fac75728e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts @@ -1,4 +1,4 @@ -import { ScriptDetails } from '../config.js'; +import { ScriptDetails, SCRIPTS_WORKSPACE_ALIAS } from '../config.js'; import { UmbScriptsRepository } from '../repository/scripts.repository.js'; import { createObservablePart, UmbBooleanState, UmbDeepState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -7,39 +7,6 @@ import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { UpdateScriptRequestModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext { - getEntityId(): string | undefined { - return this.getData()?.path; - } - getEntityType(): string { - throw new Error('Method not implemented.'); - } - save(): Promise { - const script = this.getData(); - - if (!script) return Promise.reject('Something went wrong, there is no data for script view you want to save...'); - if (this.getIsNew()) { - const createRequestBody = { - name: script.name, - content: script.content, - parentPath: script.path + '/', - }; - - this.repository.create(createRequestBody); - console.log('create'); - return Promise.resolve(); - } - if (!script.path) return Promise.reject('There is no path'); - const updateRequestBody: UpdateScriptRequestModel = { - name: script.name, - existingPath: script.path, - content: script.content, - }; - this.repository.save(script.path, updateRequestBody); - return Promise.resolve(); - } - destroy(): void { - throw new Error('Method not implemented.'); - } #data = new UmbDeepState(undefined); data = this.#data.asObservable(); name = createObservablePart(this.#data, (data) => data?.name); @@ -50,7 +17,7 @@ export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext { + const script = this.getData(); + + if (!script) return Promise.reject('Something went wrong, there is no data for script view you want to save...'); + if (this.getIsNew()) { + const createRequestBody = { + name: script.name, + content: script.content, + parentPath: script.path + '/', + }; + + this.repository.create(createRequestBody); + console.log('create'); + return Promise.resolve(); + } + if (!script.path) return Promise.reject('There is no path'); + const updateRequestBody: UpdateScriptRequestModel = { + name: script.name, + existingPath: script.path, + content: script.content, + }; + this.repository.save(script.path, updateRequestBody); + return Promise.resolve(); + } + + destroy(): void { + throw new Error('Method not implemented.'); + } + + getEntityType(): string { + throw new Error('Method not implemented.'); + } } From c287454142a9029f0d3df1969e42f0674cf5ae2c Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 7 Sep 2023 10:04:27 +0200 Subject: [PATCH 49/54] fix delete --- src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts | 8 +++++++- .../src/mocks/handlers/scripts.handlers.ts | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts index 9803695a1b..41f5f4f5d1 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts @@ -1,11 +1,12 @@ import { UmbData } from './data.js'; import { UmbEntityData } from './entity.data.js'; -import { createFileSystemTreeItem, createTextFileItem } from './utils.js'; +import { createFileItemResponseModelBaseModel, createFileSystemTreeItem, createTextFileItem } from './utils.js'; import { CreatePathFolderRequestModel, CreateTextFileViewModelBaseModel, FileSystemTreeItemPresentationModel, PagedFileSystemTreeItemPresentationModel, + ScriptItemResponseModel, ScriptResponseModel, UpdateScriptRequestModel, } from '@umbraco-cms/backoffice/backend-api'; @@ -138,6 +139,11 @@ class UmbScriptsData extends UmbData { return items.map((item) => createFileSystemTreeItem(item)); } + getItem(paths: Array): Array { + const items = this.data.filter((item) => paths.includes(item.path ?? '')); + return items.map((item) => createFileItemResponseModelBaseModel(item)); + } + getFolder(path: string): FileSystemTreeItemPresentationModel { const items = data.filter((item) => item.isFolder && item.path === path); return items as FileSystemTreeItemPresentationModel; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts index 819b83a4ae..fa3fd65840 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts @@ -35,6 +35,13 @@ const detailHandlers: RestHandler>[] = [ return res(ctx.status(200), ctx.json(response)); }), + rest.get(umbracoPath('/script/item'), (req, res, ctx) => { + const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); + if (!path) return res(ctx.status(400, 'no body found')); + const response = umbScriptsData.getItem([path]); + return res(ctx.status(200), ctx.json(response)); + }), + rest.post(umbracoPath('/script'), (req, res, ctx) => { const requestBody = req.json() as CreateTextFileViewModelBaseModel; if (!requestBody) return res(ctx.status(400, 'no body found')); From 0582da07498ffa2a0d87a78f08475c49d74b8c1c Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:04:12 +0200 Subject: [PATCH 50/54] fix wrong root path for saving --- .../src/mocks/data/scripts.data.ts | 8 +++---- .../scripts/repository/scripts.repository.ts | 4 ++-- .../scripts-workspace-edit.element.ts | 14 +++++++++-- .../workspace/scripts-workspace.context.ts | 23 +++++++++---------- .../workspace/scripts-workspace.element.ts | 2 +- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts index 41f5f4f5d1..962441933b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts @@ -219,19 +219,19 @@ class UmbScriptsData extends UmbData { } delete(paths: Array) { - const deletedPaths = this.data + const pathsOfItemsToDelete = this.data .filter((item) => { if (!item.path) throw new Error('Item has no path'); - paths.includes(item.path); + return paths.includes(item.path); }) .map((item) => item.path); this.data = this.data.filter((item) => { if (!item.path) throw new Error('Item has no path'); - paths.indexOf(item.path) === -1; + return paths.indexOf(item.path) === -1; }); - return deletedPaths; + return pathsOfItemsToDelete; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts index 77593ecc70..8a47d59102 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts @@ -134,8 +134,8 @@ export class UmbScriptsRepository } await this.#init; - - const { data, error } = await this.#treeDataSource.getChildrenOf({ path, skip: 0, take: 100 }); + const response = await this.#treeDataSource.getChildrenOf({ path, skip: 0, take: 100 }); + const { data, error } = response; if (data) { this.#treeStore!.appendItems(data.items); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts index 6ec39342e5..3db87bf14a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace-edit.element.ts @@ -1,11 +1,12 @@ import { UmbScriptsWorkspaceContext } from './scripts-workspace.context.js'; import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { UUITextStyles, UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, customElement, query, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, query, state, PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { Subject, debounceTime } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import _ from 'lodash'; @customElement('umb-scripts-workspace-edit') export class UmbScriptsWorkspaceEditElement extends UmbLitElement { @@ -26,6 +27,9 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { @state() private _path?: string | null = ''; + @state() + private _dirName?: string | null = ''; + @state() private _ready?: boolean = false; @@ -74,6 +78,12 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { }); } + protected willUpdate(_changedProperties: PropertyValueMap | Map): void { + if (_changedProperties.has('_path')) { + this._dirName = this._path?.substring(0, this._path?.lastIndexOf('/')); + } + } + #onNameInput(event: Event) { const target = event.target as UUIInputElement; const value = target.value as string; @@ -102,7 +112,7 @@ export class UmbScriptsWorkspaceEditElement extends UmbLitElement { .value=${this._name} @input=${this.#onNameInput} label="template name">
- Scripts/${this._path} + Scripts/${this._dirName}${this._name}.js diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts index 5fac75728e..895b701e09 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts @@ -4,7 +4,7 @@ import { createObservablePart, UmbBooleanState, UmbDeepState } from '@umbraco-cm import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; -import { UpdateScriptRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { TextFileResponseModelBaseModel, UpdateScriptRequestModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext { #data = new UmbDeepState(undefined); @@ -50,35 +50,34 @@ export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext { + public async save() { const script = this.getData(); - if (!script) return Promise.reject('Something went wrong, there is no data for script view you want to save...'); + if (!script) { + return Promise.reject('Something went wrong, there is no data for script you want to save...'); + } if (this.getIsNew()) { const createRequestBody = { name: script.name, content: script.content, - parentPath: script.path + '/', + parentPath: script.path === 'null' ? null : script.path + '/', }; this.repository.create(createRequestBody); - console.log('create'); return Promise.resolve(); } if (!script.path) return Promise.reject('There is no path'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts index 61524d6002..1a4a821be2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.element.ts @@ -16,7 +16,7 @@ export class UmbScriptsWorkspaceElement extends UmbLitElement { setup: async (component: PageComponent, info: IRoutingInfo) => { const parentKey = info.match.params.parentKey; const decodePath = decodeURIComponent(parentKey); - this.#scriptsWorkspaceContext.create(decodePath === 'null' ? null : parentKey); + this.#scriptsWorkspaceContext.create(decodePath); new UmbWorkspaceIsNewRedirectController( this, From 508dd04ea503f16baf0f05c61cea5251e8ef3484 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:18:07 +0200 Subject: [PATCH 51/54] add missing action --- .../src/packages/templating/scripts/entity-actions/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts index 0d135d6559..ca8a0b6229 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/manifests.ts @@ -42,7 +42,7 @@ const scriptsFolderActions: Array = [ label: 'New empty script', api: UmbCreateScriptAction, repositoryAlias: SCRIPTS_REPOSITORY_ALIAS, - entityTypes: [SCRIPTS_FOLDER_ENTITY_TYPE, SCRIPTS_ROOT_ENTITY_TYPE], + entityTypes: [SCRIPTS_FOLDER_ENTITY_TYPE, SCRIPTS_FOLDER_EMPTY_ENTITY_TYPE, SCRIPTS_ROOT_ENTITY_TYPE], }, }, { From 13e17dd4c6a19bb6b882a53bae10986aca75ba23 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 8 Sep 2023 11:05:36 +0200 Subject: [PATCH 52/54] simplify root path --- .../templating/scripts/workspace/scripts-workspace.context.ts | 2 +- .../templating/scripts/workspace/scripts-workspace.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts index 895b701e09..13fcc1d344 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/scripts-workspace.context.ts @@ -74,7 +74,7 @@ export class UmbScriptsWorkspaceContext extends UmbWorkspaceContext { const parentKey = info.match.params.parentKey; const decodePath = decodeURIComponent(parentKey); - this.#scriptsWorkspaceContext.create(decodePath); + this.#scriptsWorkspaceContext.create(decodePath === 'null' ? '' : decodePath); new UmbWorkspaceIsNewRedirectController( this, From 08e91a3ac07698e01c680029699f4555ae5351f9 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Fri, 8 Sep 2023 12:21:18 +0200 Subject: [PATCH 53/54] fix data updates --- src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts | 2 +- .../src/mocks/handlers/scripts.handlers.ts | 9 +++++---- .../templating/scripts/repository/scripts.repository.ts | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts index 962441933b..0b43b6022a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts @@ -128,7 +128,7 @@ class UmbScriptsData extends UmbData { } getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.startsWith(parentPath + '/')); + const items = this.data.filter((item) => item.path?.startsWith(parentPath)); const treeItems = items.map((item) => createFileSystemTreeItem(item)); const total = items.length; return { items: treeItems, total }; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts index fa3fd65840..409bc297ee 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts @@ -42,8 +42,8 @@ const detailHandlers: RestHandler>[] = [ return res(ctx.status(200), ctx.json(response)); }), - rest.post(umbracoPath('/script'), (req, res, ctx) => { - const requestBody = req.json() as CreateTextFileViewModelBaseModel; + rest.post(umbracoPath('/script'), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateTextFileViewModelBaseModel; if (!requestBody) return res(ctx.status(400, 'no body found')); const response = umbScriptsData.insertScript(requestBody); return res(ctx.status(200), ctx.json(response)); @@ -55,9 +55,10 @@ const detailHandlers: RestHandler>[] = [ const response = umbScriptsData.delete([path]); return res(ctx.status(200), ctx.json(response)); }), - rest.put(umbracoPath('/script'), (req, res, ctx) => { - const requestBody = req.json() as CreateTextFileViewModelBaseModel; + rest.put(umbracoPath('/script'), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateTextFileViewModelBaseModel; if (!requestBody) return res(ctx.status(400, 'no body found')); + const response = umbScriptsData.updateData(requestBody); return res(ctx.status(200)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts index 8a47d59102..b87d31ad9e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/scripts.repository.ts @@ -129,7 +129,7 @@ export class UmbScriptsRepository } async requestTreeItemsOf(path: string | null) { - if (path === null) { + if (path === null || path === '/' || path === '') { return this.requestRootTreeItems(); } From 75bf41b06fd94f2e9a132c9e706196c1910a8f40 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 12 Sep 2023 10:33:51 +0200 Subject: [PATCH 54/54] Update README.md --- src/Umbraco.Web.UI.Client/.github/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/.github/README.md b/src/Umbraco.Web.UI.Client/.github/README.md index e8312c2d13..3de9fa4023 100644 --- a/src/Umbraco.Web.UI.Client/.github/README.md +++ b/src/Umbraco.Web.UI.Client/.github/README.md @@ -48,3 +48,7 @@ Storybook is also being built and deployed automatically on the Main branch, inc ## Contributing We accept contributions to this project. However be aware that we are mainly working on a private backlog, so not everyone will be immediately obvious. If you want to get started on contributing, please read the [contribute space](https://github.com/umbraco/Umbraco.CMS.Backoffice/contribute) where you will be able to find the guidelines on how to contribute as well as a list of good first issues. + +## Documentation + +The documentation can be found on [Umbraco Docs](https://docs.umbraco.com/umbraco-backoffice/). The documentation is a work in progress.