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 4698973933..3bbb454348 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 @@ -44,7 +44,7 @@ jobs: - name: Comment on PR # azure/static-web-apps-deploy doesn't support workflow_dispatch, so we need to manually comment on the PR if: github.event_name == 'workflow_dispatch' && inputs.issue_number != null - uses: actions/github-script@v6 + uses: actions/github-script@v7 env: ISSUE_NUMBER: ${{ inputs.issue_number }} SITE_URL: ${{ steps.builddeploy.outputs.static_web_app_url }} diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/pr-first-response.yml b/src/Umbraco.Web.UI.Client/.github/workflows/pr-first-response.yml index fe5225a929..2b11c2d2d7 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/pr-first-response.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/pr-first-response.yml @@ -12,7 +12,7 @@ jobs: pull-requests: write steps: - name: Fetch random comment 🗣️ and add it to the PR - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const response = await fetch('https://collaboratorsv2.euwest01.umbraco.io/umbraco/api/comments/PostComment', { diff --git a/src/Umbraco.Web.UI.Client/.storybook/preview.js b/src/Umbraco.Web.UI.Client/.storybook/preview.js index 4fb00628d4..2b2c93ec5d 100644 --- a/src/Umbraco.Web.UI.Client/.storybook/preview.js +++ b/src/Umbraco.Web.UI.Client/.storybook/preview.js @@ -10,10 +10,10 @@ import { setCustomElements } from '@storybook/web-components'; import { startMockServiceWorker } from '../src/mocks'; import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '../src/packages/core/modal'; -import { UmbDataTypeStore } from '../src/packages/settings/data-types/repository/data-type.store.ts'; -import { UmbDocumentStore } from '../src/packages/documents/documents/repository/document.store.ts'; -import { UmbDocumentTreeStore } from '../src/packages/documents/documents/repository/document.tree.store.ts'; -import { UmbDocumentTypeStore } from '../src/packages/documents/document-types/repository/document-type.store.ts'; +import { UmbDataTypeTreeStore } from '../src/packages/core/data-type/tree/data-type.tree.store'; +import { UmbDocumentStore } from '../src/packages/documents/documents/repository/document.store'; +import { UmbDocumentTreeStore } from '../src/packages/documents/documents/repository/document.tree.store'; +import { UmbDocumentTypeStore } from '../src/packages/documents/document-types/repository/document-type.store'; import { umbExtensionsRegistry } from '../src/packages/core/extension-registry'; import { UmbIconRegistry } from '../src/shared/icon-registry/icon.registry'; import { UmbLitElement } from '../src/shared/lit-element'; @@ -21,7 +21,6 @@ import { umbLocalizationRegistry } from '../src/packages/core/localization'; import customElementManifests from '../dist-cms/custom-elements.json'; import '../src/libs/context-api/provide/context-provider.element'; -import '../src/libs/controller-api/controller-host-initializer.element.ts'; import '../src/packages/core/components'; import { manifests as documentManifests } from '../src/packages/documents'; @@ -61,7 +60,7 @@ customElements.define('umb-storybook', UmbStoryBookElement); const storybookProvider = (story) => html` ${story()} `; const dataTypeStoreProvider = (story) => html` - new UmbDataTypeStore(host)} + new UmbDataTypeTreeStore(host)} >${story()} `; diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 5ccb8c8b0a..8b2e117b61 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -33,13 +33,13 @@ "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.1", "@rollup/plugin-node-resolve": "^15.2.1", - "@storybook/addon-a11y": "7.5.2", - "@storybook/addon-actions": "7.5.2", - "@storybook/addon-essentials": "7.5.2", - "@storybook/addon-links": "7.5.2", + "@storybook/addon-a11y": "7.5.3", + "@storybook/addon-actions": "7.5.3", + "@storybook/addon-essentials": "7.5.3", + "@storybook/addon-links": "7.5.3", "@storybook/mdx2-csf": "^1.1.0", - "@storybook/web-components": "7.5.2", - "@storybook/web-components-vite": "7.5.2", + "@storybook/web-components": "7.5.3", + "@storybook/web-components-vite": "7.5.3", "@types/chai": "^4.3.5", "@types/lodash-es": "^4.17.8", "@types/mocha": "^10.0.1", @@ -74,7 +74,7 @@ "rollup-plugin-esbuild": "^5.0.0", "rollup-plugin-import-css": "^3.3.4", "rollup-plugin-web-worker-loader": "^1.6.1", - "storybook": "7.5.2", + "storybook": "7.5.3", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.7", "typescript": "^5.1.6", @@ -189,9 +189,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -397,9 +397,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -588,9 +588,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -603,14 +603,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -619,6 +619,22 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -747,9 +763,9 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", - "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -762,9 +778,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -777,9 +793,9 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -816,9 +832,9 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -933,9 +949,9 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -964,9 +980,9 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -979,9 +995,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", + "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -997,14 +1013,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1014,9 +1030,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1029,9 +1045,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1044,12 +1060,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1060,12 +1076,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", + "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1077,18 +1093,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1100,13 +1116,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1116,9 +1132,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1131,12 +1147,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1147,9 +1163,9 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1162,9 +1178,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", + "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1178,12 +1194,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1194,9 +1210,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", + "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1210,13 +1226,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", - "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.22.5" + "@babel/plugin-syntax-flow": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1226,9 +1242,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1241,13 +1257,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1258,9 +1274,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", + "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1274,9 +1290,9 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1289,9 +1305,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", + "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1305,9 +1321,9 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1320,12 +1336,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1336,12 +1352,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1353,13 +1369,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20" }, @@ -1371,12 +1387,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1403,9 +1419,9 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1418,9 +1434,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", + "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1434,9 +1450,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", + "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1450,16 +1466,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", + "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1469,13 +1485,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1485,9 +1501,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", + "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1501,9 +1517,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", + "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1518,9 +1534,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1533,12 +1549,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1549,13 +1565,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", + "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1567,9 +1583,9 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1582,9 +1598,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1598,9 +1614,9 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1613,9 +1629,9 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1628,9 +1644,9 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1644,9 +1660,9 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1659,9 +1675,9 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1674,9 +1690,9 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1689,15 +1705,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz", + "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/plugin-syntax-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1707,9 +1723,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1722,12 +1738,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1738,12 +1754,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1754,12 +1770,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1770,25 +1786,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.2", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1800,56 +1817,55 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", "babel-plugin-polyfill-corejs2": "^0.4.6", "babel-plugin-polyfill-corejs3": "^0.8.5", "babel-plugin-polyfill-regenerator": "^0.5.3", @@ -1864,14 +1880,14 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.15.tgz", - "integrity": "sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz", + "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-flow-strip-types": "^7.22.5" + "@babel/plugin-transform-flow-strip-types": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1895,16 +1911,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", - "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2646,9 +2662,9 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", - "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", "dev": true, "dependencies": { "@floating-ui/dom": "^1.5.1" @@ -4202,21 +4218,21 @@ "dev": true }, "node_modules/@storybook/addon-a11y": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.5.2.tgz", - "integrity": "sha512-HTYESaRr208b/AVguudRIy7rwRMk2bOkBr2P46ozK+8Y9mWXnKxw5O8qYS2kLuEuHfu1S+ktWp7SWjRvz8vHXA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.5.3.tgz", + "integrity": "sha512-Fs6BA4P0xBfsevo8H5E2IhMLLR3Q+FBRWHWAxGzhlkpNeH7ZZd87L5GrrLUmhzbCQvlHdWCVujWkwb21KX7Vsw==", "dev": true, "dependencies": { - "@storybook/addon-highlight": "7.5.2", - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/addon-highlight": "7.5.3", + "@storybook/channels": "7.5.3", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/theming": "7.5.3", + "@storybook/types": "7.5.3", "axe-core": "^4.2.0", "lodash": "^4.17.21", "react-resize-detector": "^7.1.2" @@ -4239,19 +4255,19 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.5.2.tgz", - "integrity": "sha512-jKF3rrMEu42TgZ5AEszADpVdASDu1S4Ozp1Ymf4akHLkaMOv+yzzD7LV6YGjJz8S2IryndZqE47e6stF0T99uA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.5.3.tgz", + "integrity": "sha512-v3yL6Eq/jCiXfA24JjRdbEQUuorms6tmrywaKcd1tAy4Ftgof0KHB4tTcTyiajrI5bh6PVJoRBkE8IDqmNAHkA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/theming": "7.5.3", + "@storybook/types": "7.5.3", "dequal": "^2.0.2", "lodash": "^4.17.21", "polished": "^4.2.2", @@ -4279,19 +4295,19 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.5.2.tgz", - "integrity": "sha512-CII8c+db8sVciWjFY0ProZi5E2d+cOc+XlVHCAVaUYp2Bp/1MV7en8etfLK7DEoH6kBVz1+t3TaPU+xjUTR8Ig==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.5.3.tgz", + "integrity": "sha512-UCOVd4UNIL5FRiwi9nyiWFocn/7ewwS6bIWnq66AaHg/sv92YwsPmgQJn0DMBGDOvUAWpiHdVsZNOTX6nvw4gA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/theming": "7.5.3", + "@storybook/types": "7.5.3", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, @@ -4313,21 +4329,21 @@ } }, "node_modules/@storybook/addon-controls": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.5.2.tgz", - "integrity": "sha512-f04VcBSfm3yMT1hvaFEwCRbdwiXQbddfEwhwjEVsqd+CA0s600W4L7B8tT4daXMsU6NsZyibev910IKTnDw6xQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.5.3.tgz", + "integrity": "sha512-KEuU4X5Xr6cJI9xrzOUVGEmUf1iHPfK7cj0GACKv0GElsdIsQryv+OZ7gRnvmNax/e2hm2t9cJcFxB24/p6rVg==", "dev": true, "dependencies": { - "@storybook/blocks": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-common": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/manager-api": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/blocks": "7.5.3", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/core-common": "7.5.3", + "@storybook/core-events": "7.5.3", + "@storybook/manager-api": "7.5.3", + "@storybook/node-logger": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/theming": "7.5.3", + "@storybook/types": "7.5.3", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" }, @@ -4349,26 +4365,26 @@ } }, "node_modules/@storybook/addon-docs": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.5.2.tgz", - "integrity": "sha512-KxX4XuxK6YcI2mUosFkAlueMon/nby6mp3GRHenuK+nobY0ecfILqSTbsOeO1wqPxALBoq7fLnrgYhdDlandgQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.5.3.tgz", + "integrity": "sha512-JVQ6iCXKESij/SbE4Wq47dkSSgBRulvA8SUf8NWL5m9qpiHrg0lPSERHfoTLiB5uC/JwF0OKIlhxoWl+zCmtYg==", "dev": true, "dependencies": { "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/csf-plugin": "7.5.2", - "@storybook/csf-tools": "7.5.2", + "@storybook/blocks": "7.5.3", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/csf-plugin": "7.5.3", + "@storybook/csf-tools": "7.5.3", "@storybook/global": "^5.0.0", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.5.2", - "@storybook/postinstall": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/react-dom-shim": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/node-logger": "7.5.3", + "@storybook/postinstall": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/react-dom-shim": "7.5.3", + "@storybook/theming": "7.5.3", + "@storybook/types": "7.5.3", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -4384,24 +4400,24 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.5.2.tgz", - "integrity": "sha512-bN7Q+8J3xVgNoBKCwtyX1O5jXuuJavYdAPiPQGrt6YegUi3gVfr5n/+/mNlu6Fd5AThFcVFei6gS9aiYmU/h8g==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.5.3.tgz", + "integrity": "sha512-PYj6swEI4nEzIbOTyHJB8u3K8ABYKoaW8XB5emMwsnrzB/TN7auHVhze2bQ/+ax5wyPKZpArPjxbWlSHtSws+A==", "dev": true, "dependencies": { - "@storybook/addon-actions": "7.5.2", - "@storybook/addon-backgrounds": "7.5.2", - "@storybook/addon-controls": "7.5.2", - "@storybook/addon-docs": "7.5.2", - "@storybook/addon-highlight": "7.5.2", - "@storybook/addon-measure": "7.5.2", - "@storybook/addon-outline": "7.5.2", - "@storybook/addon-toolbars": "7.5.2", - "@storybook/addon-viewport": "7.5.2", - "@storybook/core-common": "7.5.2", - "@storybook/manager-api": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/preview-api": "7.5.2", + "@storybook/addon-actions": "7.5.3", + "@storybook/addon-backgrounds": "7.5.3", + "@storybook/addon-controls": "7.5.3", + "@storybook/addon-docs": "7.5.3", + "@storybook/addon-highlight": "7.5.3", + "@storybook/addon-measure": "7.5.3", + "@storybook/addon-outline": "7.5.3", + "@storybook/addon-toolbars": "7.5.3", + "@storybook/addon-viewport": "7.5.3", + "@storybook/core-common": "7.5.3", + "@storybook/manager-api": "7.5.3", + "@storybook/node-logger": "7.5.3", + "@storybook/preview-api": "7.5.3", "ts-dedent": "^2.0.0" }, "funding": { @@ -4414,14 +4430,14 @@ } }, "node_modules/@storybook/addon-highlight": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.5.2.tgz", - "integrity": "sha512-0vek42fHh7Aeinvkwge0ZTq5VfNsuMSejUv0wHa3zQWgUmlaRlGY8zDw7nG6LiIz6rnTBDTznsfyWenAySSHXg==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.5.3.tgz", + "integrity": "sha512-jb+aNRhj+tFK7EqqTlNCjGkTrkWqWHGdD1ubgnj29v8XhRuCR9YboPS+306KYwBEkuF4kNCHZofLiEBPf6nCJg==", "dev": true, "dependencies": { - "@storybook/core-events": "7.5.2", + "@storybook/core-events": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.5.2" + "@storybook/preview-api": "7.5.3" }, "funding": { "type": "opencollective", @@ -4429,19 +4445,19 @@ } }, "node_modules/@storybook/addon-links": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.5.2.tgz", - "integrity": "sha512-IhUYNOJQYJd8Cnb93l8egnGCGhHV0VHo6HmZT9YjBVuUtetGQbW8Eoh0pQwuklUrJ3jLPwMoKFhN1irQXJjZwQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.5.3.tgz", + "integrity": "sha512-NcigW0HX8AllZ/KJ4u1KMiK30QvjqtC+zApI6Yc3tTaa6+BldbLv06fEgHgMY0yC8R+Ly9mUN7S1HiU7LQ7Qxg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/router": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/router": "7.5.3", + "@storybook/types": "7.5.3", "prop-types": "^15.7.2", "ts-dedent": "^2.0.0" }, @@ -4463,18 +4479,18 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.5.2.tgz", - "integrity": "sha512-fkvORLaYVC/yNMFzHRHmzlvniY7sWtpFxaRW+e4++hGXYV4VQjOBlXzdMxQhAg1DCVWD6QV8xnUQPBGrsEklog==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.5.3.tgz", + "integrity": "sha512-fun9BqUTGXgcMpcbX9wUowGDkjCL8oKasZbjp/MvGM3vPTM6HQdwzHTLJGPBnmJ1xK92NhwFRs0BrQX6uF1yrg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/types": "7.5.3", "tiny-invariant": "^1.3.1" }, "funding": { @@ -4495,18 +4511,18 @@ } }, "node_modules/@storybook/addon-outline": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.5.2.tgz", - "integrity": "sha512-BgDnVzE9xCN1xwuCebK6+apNCtVcw1ToW8N6R3vNgXgNPE1euT3jxkDH7K4RJR24Flu6BotWjX3dqv8k+8xGKw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.5.3.tgz", + "integrity": "sha512-c9vCi1SCGrtWr8qaOu/1GNWlrlrpl2lg4F9r+xtYf/KopenI3jSMz0YeTfmepZGAl+6Yc2Ywhm60jgpQ6SKciA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/types": "7.5.3", "ts-dedent": "^2.0.0" }, "funding": { @@ -4527,16 +4543,16 @@ } }, "node_modules/@storybook/addon-toolbars": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.5.2.tgz", - "integrity": "sha512-BXzb5NOpILFOM7EOBxcF2Qj/q6BicWZ1AvAddORWGmqSa/MxMIa4X52oKXFUTHKBkrTO1X0XqHmoF88qm3TUFg==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.5.3.tgz", + "integrity": "sha512-KdLr4sGMJzhtjNTNE2ocfu58yOHHUyZ/cI3BTp7a0gq9YbUpHmC3XTNr26/yOYYrdjkiMD26XusJUjXe+/V2xw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/theming": "7.5.2" + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/theming": "7.5.3" }, "funding": { "type": "opencollective", @@ -4556,18 +4572,18 @@ } }, "node_modules/@storybook/addon-viewport": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.5.2.tgz", - "integrity": "sha512-qN5X9vgp0v+WGXyFBHQ/CqjdtmnCoHhUjqXmBxEGBziJz/tZwWwtTGWeUUZpuTjCGiZutLrizOFl5MqQAI+ipg==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.5.3.tgz", + "integrity": "sha512-gT2XX0NNBrzSs1nrxadl6LnvcwgN7z2R0LzTK8/hxvx4D0EnXrV3feXLzjewr8ZYjzfEeSpO+W+bQTVNm3fNsg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/theming": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/theming": "7.5.3", "memoizerific": "^1.11.3", "prop-types": "^15.7.2" }, @@ -4589,22 +4605,22 @@ } }, "node_modules/@storybook/blocks": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.5.2.tgz", - "integrity": "sha512-Tf6XE/YcnWQVBJRcJWJzhkahjSymv6QZuxMAiKFD8v48QRJ8kTxz1tBN9676Ux+l1WwtVWxwvd/0kRKKxE70wQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.5.3.tgz", + "integrity": "sha512-Z8yF820v78clQWkwG5OA5qugbQn7rtutq9XCsd03NDB+IEfDaTFQAZG8gs62ZX2ZaXAJsqJSr/mL9oURzXto2A==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/channels": "7.5.3", + "@storybook/client-logger": "7.5.3", + "@storybook/components": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/csf": "^0.1.0", - "@storybook/docs-tools": "7.5.2", + "@storybook/docs-tools": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/theming": "7.5.3", + "@storybook/types": "7.5.3", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -4628,15 +4644,15 @@ } }, "node_modules/@storybook/builder-manager": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.5.2.tgz", - "integrity": "sha512-s4gOudrft/E4lQ19YNrzL2VJwMEpdY6z319fTlc16J1F6XZSytw6CIZPs3x9yX5CKf4/leWnN5etODaOx7NajQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.5.3.tgz", + "integrity": "sha512-uf4Vyj8ofHaq94m065SMvFKak1XrrxgI83VZAxc2QjiPcbRwcVOZd+wcKFdZydqqA6FlBDdJrU+k9INA4Qkfcw==", "dev": true, "dependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.5.2", - "@storybook/manager": "7.5.2", - "@storybook/node-logger": "7.5.2", + "@storybook/core-common": "7.5.3", + "@storybook/manager": "7.5.3", + "@storybook/node-logger": "7.5.3", "@types/ejs": "^3.1.1", "@types/find-cache-dir": "^3.2.1", "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", @@ -5045,19 +5061,19 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.5.2.tgz", - "integrity": "sha512-j96m5K0ahlAjQY6uUxEbybvmRFc3eMpQ3wiosuunc8NkXtfohXZeRVQowAcVrfPktKMufRNGY86RTYxe7sMABw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.5.3.tgz", + "integrity": "sha512-c104V3O75OCVnfZj0Jr70V09g0KSbPGvQK2Zh31omXGvakG8XrhWolYxkmjOcForJmAqsXnKs/nw3F75Gp853g==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/core-common": "7.5.2", - "@storybook/csf-plugin": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/preview": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/channels": "7.5.3", + "@storybook/client-logger": "7.5.3", + "@storybook/core-common": "7.5.3", + "@storybook/csf-plugin": "7.5.3", + "@storybook/node-logger": "7.5.3", + "@storybook/preview": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/types": "7.5.3", "@types/find-cache-dir": "^3.2.1", "browser-assert": "^1.2.1", "es-module-lexer": "^0.9.3", @@ -5108,13 +5124,13 @@ } }, "node_modules/@storybook/channels": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.5.2.tgz", - "integrity": "sha512-3SgqWq9NS0XX1QxK3riuaOLrReHWwVhI63u6q1ryDD3SttpmAezZETibOAtzDuk2FKgsyHTmAlmcGQf4ZxhOJA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.5.3.tgz", + "integrity": "sha512-dhWuV2o2lmxH0RKuzND8jxYzvSQTSmpE13P0IT/k8+I1up/rSNYOBQJT6SalakcNWXFAMXguo/8E7ApmnKKcEw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -5126,23 +5142,23 @@ } }, "node_modules/@storybook/cli": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.5.2.tgz", - "integrity": "sha512-8JPvA/K66zBmRFpRRwsD0JLqZUODRrGmNuAWx+Bj1K8wqbg68MYnOflbkSIxIVxrfhd39OrffV0h8CwKNL9gAg==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.5.3.tgz", + "integrity": "sha512-XysHSnknZTAcTbQ0bQsbfv5J8ifHpOBsmXjk1HCA05E9WGGrn9JrQRCfpDUQJ6O6UWq0bpMqzP8gFLWXFE7hug==", "dev": true, "dependencies": { "@babel/core": "^7.22.9", "@babel/preset-env": "^7.22.9", "@babel/types": "^7.22.5", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.5.2", - "@storybook/core-common": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/core-server": "7.5.2", - "@storybook/csf-tools": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/telemetry": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/codemod": "7.5.3", + "@storybook/core-common": "7.5.3", + "@storybook/core-events": "7.5.3", + "@storybook/core-server": "7.5.3", + "@storybook/csf-tools": "7.5.3", + "@storybook/node-logger": "7.5.3", + "@storybook/telemetry": "7.5.3", + "@storybook/types": "7.5.3", "@types/semver": "^7.3.4", "@yarnpkg/fslib": "2.10.3", "@yarnpkg/libzip": "2.3.0", @@ -5430,9 +5446,9 @@ "dev": true }, "node_modules/@storybook/client-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.5.2.tgz", - "integrity": "sha512-7YgLItlmiYDzWYexTaRNuHhtFarh9krsI+8l7Yjn9ryoHSTJUcTWx+yPJm1II+PQR8v/x5UgsxzultjgEurfRQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.5.3.tgz", + "integrity": "sha512-vUFYALypjix5FoJ5M/XUP6KmyTnQJNW1poHdW7WXUVSg+lBM6E5eAtjTm0hdxNNDH8KSrdy24nCLra5h0X0BWg==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5443,18 +5459,18 @@ } }, "node_modules/@storybook/codemod": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.5.2.tgz", - "integrity": "sha512-PxZg0w4OlmFB4dBzB+sCgwmHNke0n1N8vNooxtcuusrLKlbUfmssYRnQn6yRSJw0WfkUYgI10CWxGaamaOFekA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.5.3.tgz", + "integrity": "sha512-gzycFdqnF4drUjfzMTrLNHqi2jkw1lDeACUzQdug5uWxynZKAvMTHAgU0q9wvoYRR9Xhq8PhfKtXtYCCj2Er4Q==", "dev": true, "dependencies": { "@babel/core": "^7.22.9", "@babel/preset-env": "^7.22.9", "@babel/types": "^7.22.5", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/csf-tools": "7.5.3", + "@storybook/node-logger": "7.5.3", + "@storybook/types": "7.5.3", "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", "globby": "^11.0.2", @@ -5484,18 +5500,18 @@ } }, "node_modules/@storybook/components": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.5.2.tgz", - "integrity": "sha512-OP+o6AoxoQDbqjk/jdQ1arlc1T8601eCL+rS1dJY9EtAFq7Z0LEFtafhEW/Lx8FotfVGjfCNptH9ODhHU6e5Jw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.5.3.tgz", + "integrity": "sha512-M3+cjvEsDGLUx8RvK5wyF6/13LNlUnKbMgiDE8Sxk/v/WPpyhOAIh/B8VmrU1psahS61Jd4MTkFmLf1cWau1vw==", "dev": true, "dependencies": { "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-toolbar": "^1.0.4", - "@storybook/client-logger": "7.5.2", + "@storybook/client-logger": "7.5.3", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/theming": "7.5.3", + "@storybook/types": "7.5.3", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" @@ -5510,13 +5526,13 @@ } }, "node_modules/@storybook/core-client": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.5.2.tgz", - "integrity": "sha512-mMDSBxc7esMCu0FOkama9XYHzIHYGhBj8roX+XaTaLDYXaw/UajcCuzcO7fFBHNn3Vdqh2ufIxlI7359v3IqPw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.5.3.tgz", + "integrity": "sha512-sIviDytbhos02TVXxU8XLymzty7IAtLs5e16hv49JSdBp47iBajRaNBmBj/l+sgTH+3M+R6gP8yGFMsZSCnU2g==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/preview-api": "7.5.2" + "@storybook/client-logger": "7.5.3", + "@storybook/preview-api": "7.5.3" }, "funding": { "type": "opencollective", @@ -5524,14 +5540,14 @@ } }, "node_modules/@storybook/core-common": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.5.2.tgz", - "integrity": "sha512-js7fIH4wHS08dBuIVsr3JnwMtKn5O1Izc/Zor4t6PntLWkGGX4X/GxbOkasGX5SkCT1qUtB9RpdPd1sUkLhIgw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.5.3.tgz", + "integrity": "sha512-WGMwjtVUxUzFwQz7Mgs0gLuNebIGNV55dCdZgurx2/y6QOkJ2v8D0b3iL+xKMV4B5Nwoc2DsM418Y+Hy3UQd+w==", "dev": true, "dependencies": { - "@storybook/core-events": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/core-events": "7.5.3", + "@storybook/node-logger": "7.5.3", + "@storybook/types": "7.5.3", "@types/find-cache-dir": "^3.2.1", "@types/node": "^18.0.0", "@types/node-fetch": "^2.6.4", @@ -5911,9 +5927,9 @@ } }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "version": "18.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", + "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6055,9 +6071,9 @@ } }, "node_modules/@storybook/core-events": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.5.2.tgz", - "integrity": "sha512-DV8bFEFVKDEvaH87KYPXDE0YEV+Y9yjFv2xxmC9pF8l+MWCtVW72RBLhB+gU5NM1bkHrRDNb0lOJfVGKlhxOog==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.5.3.tgz", + "integrity": "sha512-DFOpyQ22JD5C1oeOFzL8wlqSWZzrqgDfDbUGP8xdO4wJu+FVTxnnWN6ZYLdTPB1u27DOhd7TzjQMfLDHLu7kbQ==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -6068,26 +6084,26 @@ } }, "node_modules/@storybook/core-server": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.5.2.tgz", - "integrity": "sha512-4oXpy1L/NyHiz/OXNUFnSeMLA/+lTgQAlVx86pRbEBDj6snt1/NSx2+yZyFtZ/XTnJ22BPpM8IIrgm95ZlQKmA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.5.3.tgz", + "integrity": "sha512-Gmq1w7ulN/VIeTDboNcb6GNM+S8T0SqhJUqeoHzn0vLGnzxeuYRJ0V3ZJhGZiJfSmCNqYAjC8QUBf6uU1gLipw==", "dev": true, "dependencies": { "@aw-web-design/x-default-browser": "1.4.126", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.5.2", - "@storybook/channels": "7.5.2", - "@storybook/core-common": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/builder-manager": "7.5.3", + "@storybook/channels": "7.5.3", + "@storybook/core-common": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.5.2", + "@storybook/csf-tools": "7.5.3", "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/telemetry": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager": "7.5.3", + "@storybook/node-logger": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/telemetry": "7.5.3", + "@storybook/types": "7.5.3", "@types/detect-port": "^1.3.0", "@types/node": "^18.0.0", "@types/pretty-hrtime": "^1.0.0", @@ -6121,9 +6137,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "version": "18.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", + "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6224,12 +6240,12 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.5.2.tgz", - "integrity": "sha512-ndjn1ia2rQLO1r1z6mXv6nipLzJMwWJp31h16lQUXIBQEOiGKjGGvObiuKaad3nNHxWHpGra4zUg7R+54Yw0Hw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.5.3.tgz", + "integrity": "sha512-yQ3S/IOT08Y7XTnlc3SPkrJKZ6Xld6liAlHn+ddjge4oZa0hUqwYLb+piXUhFMfL6Ij65cj4hu3vMbw89azIhg==", "dev": true, "dependencies": { - "@storybook/csf-tools": "7.5.2", + "@storybook/csf-tools": "7.5.3", "unplugin": "^1.3.1" }, "funding": { @@ -6238,9 +6254,9 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.5.2.tgz", - "integrity": "sha512-yXaEDREc2wvkjYkQqDMatJw23f0fEFhMIf/zBNF7YljeYw0j8jAg/7XI5WJJSN2KTxD/feD/yD+6eaLUXvrneQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.5.3.tgz", + "integrity": "sha512-676C3ISn7FQJKjb3DBWXhjGN2OQEv4s71dx+5D0TlmswDCOOGS8dYFjP8wVx51+mAIE8CROAw7vLHLtVKU7SwQ==", "dev": true, "dependencies": { "@babel/generator": "^7.22.9", @@ -6248,7 +6264,7 @@ "@babel/traverse": "^7.22.8", "@babel/types": "^7.22.5", "@storybook/csf": "^0.1.0", - "@storybook/types": "7.5.2", + "@storybook/types": "7.5.3", "fs-extra": "^11.1.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" @@ -6265,14 +6281,14 @@ "dev": true }, "node_modules/@storybook/docs-tools": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.5.2.tgz", - "integrity": "sha512-mBiZFhzMA2ub7wX0ho3UqKqKXO+xUi/rqb4KV4PihLKlhThEdzKyYrIZO4W90NOmlp1yUJJcjG8D8SUPuHQoTw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.5.3.tgz", + "integrity": "sha512-f20EUQlwamcSPrOFn42fj9gpkZIDNCZkC3N19yGzLYiE4UMyaYQgRl18oLvqd3M6aBm6UW6SCoIIgeaOViBSqg==", "dev": true, "dependencies": { - "@storybook/core-common": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/core-common": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/types": "7.5.3", "@types/doctrine": "^0.0.3", "doctrine": "^3.0.0", "lodash": "^4.17.21" @@ -6289,9 +6305,9 @@ "dev": true }, "node_modules/@storybook/manager": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.5.2.tgz", - "integrity": "sha512-5l1z9SpCFQBcHjC5mbfWQ8mPTYFxD8GQ9mNZ6PPrj47yu9TyCRYSQj7A8ZXJiIY1ZEg4a2BCW7fPUYG+lX6Drw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.5.3.tgz", + "integrity": "sha512-3ZZrHYcXWAQXpDQZBvKyScGgQaAaBc63i+KC2mXqzTdXuJhVDUiylvqLRprBnrEprgePQLFrxGC2JSHUwH7dqg==", "dev": true, "funding": { "type": "opencollective", @@ -6299,19 +6315,19 @@ } }, "node_modules/@storybook/manager-api": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.5.2.tgz", - "integrity": "sha512-WX8GjBkITRQzhQ08WEAVjdDW8QqqIQhWOpFzXUYCxCNzt1eSALI31QQ+M1/MYymw+TOkotC/SMcn/puIAm4rdA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.5.3.tgz", + "integrity": "sha512-d8mVLr/5BEG4bAS2ZeqYTy/aX4jPEpZHdcLaWoB4mAM+PAL9wcWsirUyApKtDVYLITJf/hd8bb2Dm2ok6E45gA==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/channels": "7.5.3", + "@storybook/client-logger": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/router": "7.5.3", + "@storybook/theming": "7.5.3", + "@storybook/types": "7.5.3", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -6369,9 +6385,9 @@ "dev": true }, "node_modules/@storybook/node-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.5.2.tgz", - "integrity": "sha512-VIBuwPJOylu8vJofk1VfmqxlhXgbBgV0pCTo/UzdQAbc3w5y+qNRemf8goWxYEY+L9p6oUXqm/i9+bNGyX7/Mw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.5.3.tgz", + "integrity": "sha512-7ZZDw/q3hakBj1FngsBjaHNIBguYAWojp7R1fFTvwkeunCi21EUzZjRBcqp10kB6BP3/NLX32bIQknsCWD76rQ==", "dev": true, "funding": { "type": "opencollective", @@ -6379,9 +6395,9 @@ } }, "node_modules/@storybook/postinstall": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.5.2.tgz", - "integrity": "sha512-fKgyV1fAgckDoxQkUGJl5uzjzGC5esC/nITiCjccZFrqxt9mgmz4VAUkMeseD5tfWQ5oFA0Xdgtrrcl39+chnw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.5.3.tgz", + "integrity": "sha512-r+H3xGMu2A9yOSsygc3bDFhku8wpOZF3SqO19B7eAML12viHwUtYfyGL74svw4TMcKukyQ+KPn5QsSG+4bjZMg==", "dev": true, "funding": { "type": "opencollective", @@ -6389,9 +6405,9 @@ } }, "node_modules/@storybook/preview": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.5.2.tgz", - "integrity": "sha512-dA5VpHp0D9nh9/wOzWP8At1wtz/SiaMBbwaiEOFTFUGcPerrkroEWadIlSSB7vgQJ9yWiD4l3KDaS8ANzHWtPQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.5.3.tgz", + "integrity": "sha512-Hf90NlLaSrdMZXPOHDCMPjTywVrQKK0e5CtzqWx/ZQz91JDINxJD+sGj2wZU+wuBtQcTtlsXc9OewlJ+9ETwIw==", "dev": true, "funding": { "type": "opencollective", @@ -6399,17 +6415,17 @@ } }, "node_modules/@storybook/preview-api": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.5.2.tgz", - "integrity": "sha512-rpmHR/09UBSnorDBTcE7JgHUQjZLO146NCI+vbI7Pqfb4QX/8lhwkFr4cuHRAR16mv6DAJbDVoPETO0Z/CH9aw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.5.3.tgz", + "integrity": "sha512-LNmEf7oBRnZ1wG3bQ+P+TO29+NN5pSDJiAA6FabZBrtIVm+psc2lxBCDQvFYyAFzQSlt60toGKNW8+RfFNdR5Q==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/channels": "7.5.3", + "@storybook/client-logger": "7.5.3", + "@storybook/core-events": "7.5.3", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.5.2", + "@storybook/types": "7.5.3", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -6425,9 +6441,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.5.2.tgz", - "integrity": "sha512-x7h3TTLRLs8mrsCBKXbvjBRFms73XrNlm0Lo5Tu/Tf//+pwOFq+2sGBkqbRkYd54jNHhpqNF7+UUdzA93ESnbQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.5.3.tgz", + "integrity": "sha512-9aNcKdhoP36jMrcXgfzE9jVg/SpqPpWnUJM70upYoZXytG2wQSPtawLHHyC6kycvTzwncyfF3rwUnOFBB8zmig==", "dev": true, "funding": { "type": "opencollective", @@ -6439,12 +6455,12 @@ } }, "node_modules/@storybook/router": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.5.2.tgz", - "integrity": "sha512-jlh48TVUlqvGkU8MnkVp9SrCHomWGtQGx1WMK94NMyOPVPTLWzM6LjIybgmHz0MTe4lpzmbiIOfSlU3pPX054w==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.5.3.tgz", + "integrity": "sha512-/iNYCFore7R5n6eFHbBYoB0P2/sybTVpA+uXTNUd3UEt7Ro6CEslTaFTEiH2RVQwOkceBp/NpyWon74xZuXhMg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", + "@storybook/client-logger": "7.5.3", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -6458,14 +6474,14 @@ } }, "node_modules/@storybook/telemetry": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.5.2.tgz", - "integrity": "sha512-tUgrcIx1vTMhTySp11JbBnWLsaMUNlil5yuOWEJy5i71E4Xy/2hYUtLfxzgXWd/0W7eTl4p2tjUk9uS8AP+S0Q==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.5.3.tgz", + "integrity": "sha512-X6alII3o0jCb5xALuw+qcWmvyrbhlkmPeNZ6ZQXknOfB4DkwponFdWN5y6W7yGvr01xa5QBepJRV79isl97d8g==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/core-common": "7.5.2", - "@storybook/csf-tools": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/core-common": "7.5.3", + "@storybook/csf-tools": "7.5.3", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", @@ -6530,13 +6546,13 @@ } }, "node_modules/@storybook/theming": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.5.2.tgz", - "integrity": "sha512-DZBTcYErSYvmTYsGz7lKtiIcBe8flBw5Ojp52r3O4GcRYG4AbuUwwVvehz+O1cWaS+UW3HavrcgapERH7ZHd1A==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.5.3.tgz", + "integrity": "sha512-Cjmthe1MAk0z4RKCZ7m72gAD8YD0zTAH97z5ryM1Qv84QXjiCQ143fGOmYz1xEQdNFpOThPcwW6FEccLHTkVcg==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.5.2", + "@storybook/client-logger": "7.5.3", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -6550,12 +6566,12 @@ } }, "node_modules/@storybook/types": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.5.2.tgz", - "integrity": "sha512-RDKHo6WUES+4nt7uZMfankjxdpYX2EI2GpJ2n2RPcnhzmb/ub1huNTjbzDEYMqY24SppljZeIN57m3Ar6L6f9A==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.5.3.tgz", + "integrity": "sha512-iu5W0Kdd6nysN5CPkY4GRl+0BpxRTdSfBIJak7mb6xCIHSB5t1tw4BOuqMQ5EgpikRY3MWJ4gY647QkWBX3MNQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", + "@storybook/channels": "7.5.3", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", "file-system-cache": "2.3.0" @@ -6566,18 +6582,18 @@ } }, "node_modules/@storybook/web-components": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.5.2.tgz", - "integrity": "sha512-8bMxO4xqk3gvTHGx7Cv/9ZxJsYuYZT2dd3Em8vJzwRyMI1H+85mkSRqscuPvVywIdapKlEDDMhvfF80zfz2YxA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.5.3.tgz", + "integrity": "sha512-C+2bx1ZuelUVRj6H1IcAu5W0kwli3GXJcgfbdL8FCW1d3UMYCxITQ0ZzixQWCMi+GootmYALv1vTmsoQOsdulA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/core-client": "7.5.2", - "@storybook/docs-tools": "7.5.2", + "@storybook/client-logger": "7.5.3", + "@storybook/core-client": "7.5.3", + "@storybook/docs-tools": "7.5.3", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/manager-api": "7.5.3", + "@storybook/preview-api": "7.5.3", + "@storybook/types": "7.5.3", "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0" }, @@ -6593,15 +6609,15 @@ } }, "node_modules/@storybook/web-components-vite": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.5.2.tgz", - "integrity": "sha512-8yXz/b0SynB+TA1IvYZd+EZDqXfsgXbGJA3tJMmDTCQ/GHSzJW6a2wnec2OqVvwhpcN2mHyItyblaiDAAodMCA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.5.3.tgz", + "integrity": "sha512-DwVJX5wkeHIfuufBKiqm9FOTNjS1SnOV0xd2J3/7erhLzP1dC3CQtbGOhTe0cDsc0i/WjIcVF0l+NaOXnwKGVA==", "dev": true, "dependencies": { - "@storybook/builder-vite": "7.5.2", - "@storybook/core-server": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/web-components": "7.5.2", + "@storybook/builder-vite": "7.5.3", + "@storybook/core-server": "7.5.3", + "@storybook/node-logger": "7.5.3", + "@storybook/web-components": "7.5.3", "magic-string": "^0.30.0" }, "engines": { @@ -6674,9 +6690,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -6687,18 +6703,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -6706,9 +6722,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -6800,9 +6816,9 @@ } }, "node_modules/@types/cross-spawn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.4.tgz", - "integrity": "sha512-GGLpeThc2Bu8FBGmVn76ZU3lix17qZensEI4/MPty0aZpm2CHfgEMis31pf5X5EiudYKcPAsWciAsCALoPo5dw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-wsIMP68FvGXk+RaWhraz6Xp4v7sl4qwzHAmtPaJEN2NRTXXI9LtFawUpeTsBNL/pd6QoLStdytCaAyiK7AEd/Q==", "dev": true, "dependencies": { "@types/node": "*" @@ -6824,9 +6840,9 @@ } }, "node_modules/@types/detect-port": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.4.tgz", - "integrity": "sha512-HveFGabu3IwATqwLelcp6UZ1MIzSFwk+qswC9luzzHufqAwhs22l7KkINDLWRfXxIPTYnSZ1DuQBEgeVPgUOSA==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz", + "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==", "dev": true }, "node_modules/@types/doctrine": { @@ -6844,15 +6860,15 @@ } }, "node_modules/@types/ejs": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.4.tgz", - "integrity": "sha512-fnM/NjByiWdSRJRrmGxgqOSAnmOnsvX1QcNYk5TVyIIj+7ZqOKMb9gQa4OIl/lil2w/8TiTWV+nz3q8yqxez/w==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", "dev": true }, "node_modules/@types/emscripten": { - "version": "1.39.9", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.9.tgz", - "integrity": "sha512-ILdWj4XYtNOqxJaW22NEQx2gJsLfV5ncxYhhGX1a1H1lXl2Ta0gUz7QOnOoF1xQbJwWDjImi8gXN9mKdIf6n9g==", + "version": "1.39.10", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz", + "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==", "dev": true }, "node_modules/@types/estree": { @@ -6898,9 +6914,9 @@ "dev": true }, "node_modules/@types/graceful-fs": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", - "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -7056,9 +7072,9 @@ "dev": true }, "node_modules/@types/mime-types": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.3.tgz", - "integrity": "sha512-bvxCbHeeS7quxS7uOJShyoOQj/BfLabhF6mk9Rmr+2MRfW8W1yxyyL/0GTxLFTHen41GrIw4K3D4DrLouhb8vg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", + "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", "dev": true }, "node_modules/@types/mocha": { @@ -7080,9 +7096,9 @@ "dev": true }, "node_modules/@types/node-fetch": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.8.tgz", - "integrity": "sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==", "dev": true, "dependencies": { "@types/node": "*", @@ -7090,9 +7106,9 @@ } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", - "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/parse5": { @@ -7102,9 +7118,9 @@ "dev": true }, "node_modules/@types/pretty-hrtime": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.2.tgz", - "integrity": "sha512-vyv9knII8XeW8TnXDcGH7HqG6FeR56ESN6ExM34d/U8Zvs3xuG34euV6CVyB7KEYI7Ts4lQM8b4NL72e7UadnA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==", "dev": true }, "node_modules/@types/prop-types": { @@ -7248,18 +7264,18 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@types/yauzl": { @@ -9772,9 +9788,9 @@ } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, "node_modules/async-limiter": { @@ -12921,9 +12937,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.220.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.220.0.tgz", - "integrity": "sha512-Fks+nOCqhorp4NpAtAxf09UaR/9xDf3AnU1UkWczmpneoHh06Y3AoEA4tIe2HbYrOHT9JArUgDZpCFhP4clo1A==", + "version": "0.221.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.221.0.tgz", + "integrity": "sha512-i+GzdLcKYy5bxhx1N+FIcR1bTqssuVWTJcuytMhwqLAxifz46g4BSNicWXGrtzT0HibJUBIzZOYA3FveJucTPg==", "dev": true, "engines": { "node": ">=0.4.0" @@ -13183,9 +13199,9 @@ } }, "node_modules/get-npm-tarball-url": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.0.3.tgz", - "integrity": "sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.1.0.tgz", + "integrity": "sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==", "dev": true, "engines": { "node": ">=12.17" @@ -18003,14 +18019,50 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", + "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, "engines": { "node": "14 || >=16.14" } }, + "node_modules/path-scurry/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/path-scurry/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/path-scurry/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -20001,12 +20053,12 @@ "dev": true }, "node_modules/storybook": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.5.2.tgz", - "integrity": "sha512-wuB5VdmI6teU2z5iiBEZ2ziNeP6g6Da/dGM7+tWQVUl8bmfOmpEgzgEyS1/XqdOfm+HoZplspwM0XMHOLo/Now==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.5.3.tgz", + "integrity": "sha512-lkn9hcedNmSNCzbDIrky2LpZJqlpS7Fy1KpGBZmLY34g5Mb0+KnXaUqzY0dxsd7aFm8Oa7Du/emceMYNNL4DMA==", "dev": true, "dependencies": { - "@storybook/cli": "7.5.2" + "@storybook/cli": "7.5.3" }, "bin": { "sb": "index.js", @@ -20566,9 +20618,9 @@ } }, "node_modules/tocbot": { - "version": "4.21.6", - "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.21.6.tgz", - "integrity": "sha512-bAnyV6SU2n1AvuBvEgi8t7KiIn5rRiEmwFp4+elx/1ueuncAUyubITfXDMwOqStgUwh8pDzLdWgDKLicsJPikw==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.22.0.tgz", + "integrity": "sha512-YHCs00HCNiHxUhksloa36fTfMEXEWV+vdPn3ARQfmj2u3PcUYIjJkfc+ABUfCF9Eb+LSy/QzuLl256fbsRnpHQ==", "dev": true }, "node_modules/toidentifier": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 50145a4985..e353bae20a 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -150,13 +150,13 @@ "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.1", "@rollup/plugin-node-resolve": "^15.2.1", - "@storybook/addon-a11y": "7.5.2", - "@storybook/addon-actions": "7.5.2", - "@storybook/addon-essentials": "7.5.2", - "@storybook/addon-links": "7.5.2", + "@storybook/addon-a11y": "7.5.3", + "@storybook/addon-actions": "7.5.3", + "@storybook/addon-essentials": "7.5.3", + "@storybook/addon-links": "7.5.3", "@storybook/mdx2-csf": "^1.1.0", - "@storybook/web-components": "7.5.2", - "@storybook/web-components-vite": "7.5.2", + "@storybook/web-components": "7.5.3", + "@storybook/web-components-vite": "7.5.3", "@types/chai": "^4.3.5", "@types/lodash-es": "^4.17.8", "@types/mocha": "^10.0.1", @@ -191,7 +191,7 @@ "rollup-plugin-esbuild": "^5.0.0", "rollup-plugin-import-css": "^3.3.4", "rollup-plugin-web-worker-loader": "^1.6.1", - "storybook": "7.5.2", + "storybook": "7.5.3", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.7", "typescript": "^5.1.6", 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 f5447b0b8a..c72ac88069 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -1,6 +1,6 @@ import { handlers as dataTypeHandlers } from './handlers/data-type/index.js'; import { handlers as relationTypeHandlers } from './handlers/relation-type.handlers.js'; -import { handlers as documentTypeHandlers } from './handlers/document-type.handlers.js'; +import { handlers as documentTypeHandlers } from './handlers/document-type/index.js'; import { handlers as installHandlers } from './handlers/install.handlers.js'; import * as manifestsHandlers from './handlers/manifests.handlers.js'; import { handlers as publishedStatusHandlers } from './handlers/published-status.handlers.js'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-type.data.ts index 831facacd5..a863da9edc 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-type.data.ts @@ -4,6 +4,7 @@ import { DocumentTypeTreeItemResponseModel, DocumentTypeResponseModel, ContentTypeCompositionTypeModel, + DocumentTypeItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; export const data: Array = [ @@ -1166,6 +1167,20 @@ class UmbDocumentTypeData extends UmbEntityData { const items = this.treeData.filter((item) => allowedTypeKeys.includes(item.id ?? '')); return items.map((item) => item); } + + getItems(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); + return items.map((item) => createDocumentTypeItem(item)); + } } +const createDocumentTypeItem = (item: DocumentTypeResponseModel): DocumentTypeItemResponseModel => { + return { + id: item.id, + name: item.name, + isElement: item.isElement, + icon: item.icon, + }; +}; + export const umbDocumentTypeData = new UmbDocumentTypeData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts index 26f845a4b1..f79da572c9 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts @@ -87,7 +87,7 @@ h1 { path: 'Folder 1/Stylesheet File 3.css', name: 'Stylesheet File 3.css', type: 'stylesheet', - hasChildren: true, + hasChildren: false, isFolder: false, content: `h1 { color: pink; @@ -225,9 +225,10 @@ ${rule.selector} { } insertStyleSheet(item: CreateTextFileViewModelBaseModel) { + const parentPath = item.parentPath ? `${item.parentPath}/` : ''; const newItem: StylesheetDBItem = { ...item, - path: `${item.parentPath}/${item.name}.css`, + path: `${parentPath}${item.name}`, isFolder: false, hasChildren: false, type: 'stylesheet', @@ -238,7 +239,6 @@ ${rule.selector} { return newItem; } - insert(item: StylesheetDBItem) { const exits = this.data.find((i) => i.path === item.path); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts index 44c8707a2f..84a92de3d8 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts @@ -1,5 +1,5 @@ import { handlers as dataTypeHandlers } from './handlers/data-type/index.js'; -import { handlers as documentTypeHandlers } from './handlers/document-type.handlers.js'; +import { handlers as documentTypeHandlers } from './handlers/document-type/index.js'; import { handlers as installHandlers } from './handlers/install.handlers.js'; import * as manifestsHandlers from './handlers/manifests.handlers.js'; import { handlers as publishedStatusHandlers } from './handlers/published-status.handlers.js'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type.handlers.ts deleted file mode 100644 index 8fea958f41..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type.handlers.ts +++ /dev/null @@ -1,99 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { umbDocumentTypeData } from '../data/document-type.data.js'; -import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; - -// TODO: add schema -export const handlers = [ - rest.post(umbracoPath(`/document-type`), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - - // TODO: This is something that is missing in the Full model, but which we need to for the tree model. This should be fixed in the Full model. - data.parentId ??= null; - - const created = umbDocumentTypeData.insert(data); - - // TODO: remove this hack, as we get the right end-point, in that case we will be in control of the Ids. (I choose this URL to make it clear thats its a hack/mocked URL) - return res(ctx.status(200), ctx.set({ location: '/header/location/id/' + created.id })); - }), - - rest.put(umbracoPath(`/document-type/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - - const saved = umbDocumentTypeData.save(id, data); - - return res(ctx.status(200), ctx.json(saved)); - }), - - rest.get('/umbraco/management/api/v1/document-type/details/:id', (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - - const document = umbDocumentTypeData.getById(id); - - return res(ctx.status(200), ctx.json([document])); - }), - - rest.post('/umbraco/management/api/v1/document-type/details/save', (req, res, ctx) => { - const data = req.body; - if (!data) return; - - const saved = umbDocumentTypeData.save(data.id!, data); - - return res(ctx.status(200), ctx.json(saved)); - }), - - rest.get('/umbraco/management/api/v1/tree/document-type/root', (req, res, ctx) => { - const rootItems = umbDocumentTypeData.getTreeRoot(); - const response = { - total: rootItems.length, - items: rootItems, - }; - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get('/umbraco/management/api/v1/tree/document-type/children', (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); - if (!parentId) return; - - const children = umbDocumentTypeData.getTreeItemChildren(parentId); - - const response = { - total: children.length, - items: children, - }; - - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get('/umbraco/management/api/v1/tree/document-type/item', (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (!ids) return; - - const items = umbDocumentTypeData.getTreeItem(ids); - - return res(ctx.status(200), ctx.json(items)); - }), - - rest.get('/umbraco/management/api/v1/document-type/:id', (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - - const documentType = umbDocumentTypeData.getById(id); - - return res(ctx.status(200), ctx.json(documentType)); - }), - - rest.get('/umbraco/management/api/v1/document-type/allowed-children-of/:id', (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - - const items = umbDocumentTypeData.getAllowedTypesOf(id); - - return res(ctx.status(200), ctx.json(items)); - }), -]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/detail.handlers.ts new file mode 100644 index 0000000000..f93686a065 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/detail.handlers.ts @@ -0,0 +1,36 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentTypeData } from '../../data/document-type.data.js'; +import { slug } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const handlers = [ + rest.get(umbracoPath(`${slug}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + const document = umbDocumentTypeData.getById(id); + return res(ctx.status(200), ctx.json(document)); + }), + + rest.delete(umbracoPath(`${slug}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + const document = umbDocumentTypeData.getById(id); + return res(ctx.status(200), ctx.json(document)); + }), + + rest.put(umbracoPath(`${slug}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + const data = await req.json(); + if (!data) return; + const saved = umbDocumentTypeData.save(id, data); + return res(ctx.status(200), ctx.json(saved)); + }), + + rest.post(umbracoPath(`${slug}`), async (req, res, ctx) => { + const data = await req.json(); + if (!data) return; + umbDocumentTypeData.insert(data); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/index.ts new file mode 100644 index 0000000000..e691416e8c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/index.ts @@ -0,0 +1,5 @@ +import { handlers as treeHandlers } from './tree.handlers.js'; +import { handlers as detailHandlers } from './detail.handlers.js'; +import { handlers as itemHandlers } from './item.handlers.js'; + +export const handlers = [...treeHandlers, ...itemHandlers, ...detailHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/item.handlers.ts new file mode 100644 index 0000000000..6a2356c703 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/item.handlers.ts @@ -0,0 +1,13 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentTypeData } from '../../data/document-type.data.js'; +import { slug } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const handlers = [ + rest.get(umbracoPath(`${slug}/item`), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbDocumentTypeData.getItems(ids); + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/slug.ts new file mode 100644 index 0000000000..d81153decf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/slug.ts @@ -0,0 +1 @@ +export const slug = '/document-type'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts new file mode 100644 index 0000000000..37014d9edf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts @@ -0,0 +1,29 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentTypeData } from '../../data/document-type.data.js'; +import { slug } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const handlers = [ + rest.get(umbracoPath(`/tree${slug}/root`), (req, res, ctx) => { + const rootItems = umbDocumentTypeData.getTreeRoot(); + const response = { + total: rootItems.length, + items: rootItems, + }; + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${slug}/children`), (req, res, ctx) => { + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + + const children = umbDocumentTypeData.getTreeItemChildren(parentId); + + const response = { + total: children.length, + items: children, + }; + + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts index 3ae10d1f33..dba7083fa2 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts @@ -39,8 +39,8 @@ const detailHandlers = [ const response = umbStylesheetData.getStylesheet(path); return res(ctx.status(200), ctx.json(response)); }), - rest.post(umbracoPath('/stylesheet'), (req, res, ctx) => { - const requestBody = req.json() as CreateTextFileViewModelBaseModel; + rest.post(umbracoPath('/stylesheet'), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateTextFileViewModelBaseModel; if (!requestBody) return res(ctx.status(400, 'no body found')); const response = umbStylesheetData.insertStyleSheet(requestBody); return res(ctx.status(200), ctx.json(response)); @@ -53,7 +53,7 @@ const detailHandlers = [ return res(ctx.status(200), ctx.json(response)); }), rest.put(umbracoPath('/stylesheet'), async (req, res, ctx) => { - const requestBody = await req.json() as UpdateStylesheetRequestModel; + const requestBody = (await req.json()) as UpdateStylesheetRequestModel; if (!requestBody) return res(ctx.status(400, 'no body found')); umbStylesheetData.updateData(requestBody); return res(ctx.status(200)); @@ -75,7 +75,6 @@ const detailHandlers = [ }), ]; - const rulesHandlers = [ rest.post(umbracoPath('/stylesheet/rich-text/extract-rules'), async (req, res, ctx) => { const requestBody = req.json() as ExtractRichTextStylesheetRulesRequestModel; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/components/data-type-input/data-type-input.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/components/data-type-input/data-type-input.context.ts index 68737d8df9..88adc58037 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/components/data-type-input/data-type-input.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/components/data-type-input/data-type-input.context.ts @@ -1,3 +1,4 @@ +import { DATA_TYPE_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UmbPickerInputContext } from '@umbraco-cms/backoffice/picker-input'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UMB_DATA_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; @@ -5,6 +6,6 @@ import { DataTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbDataTypePickerContext extends UmbPickerInputContext { constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Repository.DataType', UMB_DATA_TYPE_PICKER_MODAL); + super(host, DATA_TYPE_ITEM_REPOSITORY_ALIAS, UMB_DATA_TYPE_PICKER_MODAL); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/components/data-type-input/data-type-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/components/data-type-input/data-type-input.element.ts index 0d330326c8..a67e9445b4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/components/data-type-input/data-type-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/components/data-type-input/data-type-input.element.ts @@ -84,13 +84,13 @@ export class UmbDataTypeInputElement extends FormControlMixin(UmbLitElement) { this.addValidator( 'rangeUnderflow', () => this.minMessage, - () => !!this.min && this.#pickerContext.getSelection().length < this.min + () => !!this.min && this.#pickerContext.getSelection().length < this.min, ); this.addValidator( 'rangeOverflow', () => this.maxMessage, - () => !!this.max && this.#pickerContext.getSelection().length > this.max + () => !!this.max && this.#pickerContext.getSelection().length > this.max, ); this.observe(this.#pickerContext.selection, (selection) => (super.value = selection.join(','))); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/item/data-type-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/item/data-type-item.repository.ts index faa193daad..1794d99ffc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/item/data-type-item.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/item/data-type-item.repository.ts @@ -1,47 +1,11 @@ -import { UmbDataTypeRepositoryBase } from '../data-type-repository-base.js'; import { UmbDataTypeItemServerDataSource } from './data-type-item.server.data.js'; +import { UMB_DATA_TYPE_ITEM_STORE_CONTEXT } from './data-type-item.store.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbItemDataSource, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; import { DataTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export class UmbDataTypeItemRepository - extends UmbDataTypeRepositoryBase - implements UmbItemRepository -{ - #itemSource: UmbItemDataSource; - +export class UmbDataTypeItemRepository extends UmbItemRepositoryBase { constructor(host: UmbControllerHost) { - super(host); - this.#itemSource = new UmbDataTypeItemServerDataSource(host); - } - - /** - * Requests the Data Type items for the given ids - * @param {Array} ids - * @return {*} - * @memberof UmbDataTypeItemRepository - */ - async requestItems(ids: Array) { - if (!ids) throw new Error('Ids are missing'); - await this._init; - - const { data, error } = await this.#itemSource.getItems(ids); - - if (data) { - this._itemStore!.appendItems(data); - } - - return { data, error, asObservable: () => this._itemStore!.items(ids) }; - } - - /** - * Returns a promise with an observable of the Data Type items for the given ids - * @param {Array} ids - * @return {Promise>} - * @memberof UmbDataTypeItemRepository - */ - async items(ids: Array) { - await this._init; - return this._itemStore!.items(ids); + super(host, UmbDataTypeItemServerDataSource, UMB_DATA_TYPE_ITEM_STORE_CONTEXT); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts index 991941fa25..e3686a7fdf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.repository.ts @@ -1,24 +1,20 @@ +import { UmbTreeRepositoryBase } from '../../tree/tree-repository-base.js'; import { DATA_TYPE_ROOT_ENTITY_TYPE } from '../entities.js'; -import { UmbDataTypeRepositoryBase } from '../repository/data-type-repository-base.js'; import { UmbDataTypeTreeServerDataSource } from './data-type.tree.server.data.js'; -import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from './data-type.tree.store.js'; +import { UmbDataTypeTreeItemModel, UmbDataTypeTreeRootModel } from './types.js'; import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { FolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbDataTypeTreeRepository - extends UmbDataTypeRepositoryBase - implements UmbTreeRepository, UmbApi -{ - #treeSource: UmbTreeDataSource; +export class UmbDataTypeTreeRepository + extends UmbTreeRepositoryBase + implements UmbApi +{ constructor(host: UmbControllerHost) { - super(host); - this.#treeSource = new UmbDataTypeTreeServerDataSource(this); + super(host, UmbDataTypeTreeServerDataSource, UMB_DATA_TYPE_TREE_STORE_CONTEXT); } async requestTreeRoot() { - await this._init; - const data = { id: null, type: DATA_TYPE_ROOT_ENTITY_TYPE, @@ -29,40 +25,4 @@ export class UmbDataTypeTreeRepository return { data }; } - - async requestRootTreeItems() { - await this._init; - - const { data, error } = await this.#treeSource.getRootItems(); - - if (data) { - this._treeStore!.appendItems(data.items); - } - - return { data, error, asObservable: () => this._treeStore!.rootItems }; - } - - async requestTreeItemsOf(parentId: string | null) { - await this._init; - if (parentId === undefined) throw new Error('Parent id is missing'); - - const { data, error } = await this.#treeSource.getChildrenOf(parentId); - - if (data) { - this._treeStore!.appendItems(data.items); - } - - return { data, error, asObservable: () => this._treeStore!.childrenOf(parentId) }; - } - - async rootTreeItems() { - await this._init; - return this._treeStore!.rootItems; - } - - async treeItemsOf(parentId: string | null) { - if (parentId === undefined) throw new Error('Parent id is missing'); - await this._init; - return this._treeStore!.childrenOf(parentId); - } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type.tree.server.data.ts index 5c9a96772c..d1f5a67a15 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type.tree.server.data.ts @@ -1,5 +1,5 @@ -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; -import { DataTypeResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; +import { DataTypeResource, DataTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -9,7 +9,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @class UmbDataTypeTreeServerDataSource * @implements {DocumentTreeDataSource} */ -export class UmbDataTypeTreeServerDataSource implements UmbTreeDataSource { +export class UmbDataTypeTreeServerDataSource implements UmbTreeDataSource { #host: UmbControllerHost; /** @@ -48,7 +48,7 @@ export class UmbDataTypeTreeServerDataSource implements UmbTreeDataSource { this.#host, DataTypeResource.getTreeDataTypeChildren({ parentId, - }) + }), ); } } @@ -65,7 +65,7 @@ export class UmbDataTypeTreeServerDataSource implements UmbTreeDataSource { this.#host, DataTypeResource.getDataTypeItem({ id: ids, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type.tree.store.ts index 4f41e6642a..d823d2165a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; /** * @export diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/types.ts new file mode 100644 index 0000000000..60389e3686 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/types.ts @@ -0,0 +1,5 @@ +import { type DataTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbEntityTreeItemModel, UmbEntityTreeRootModel } from '@umbraco-cms/backoffice/tree'; + +export type UmbDataTypeTreeItemModel = DataTypeTreeItemResponseModel & UmbEntityTreeItemModel; +export type UmbDataTypeTreeRootModel = DataTypeTreeItemResponseModel & UmbEntityTreeRootModel; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/store.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/store.model.ts index 25e90a73b6..f50dee13ae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/store.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/store.model.ts @@ -1,5 +1,6 @@ -import type { ManifestApi } from '@umbraco-cms/backoffice/extension-api'; -import { UmbItemStore, UmbStoreBase, UmbTreeStore } from '@umbraco-cms/backoffice/store'; +import { type ManifestApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbItemStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; +import { type UmbTreeStore } from '@umbraco-cms/backoffice/tree'; export interface ManifestStore extends ManifestApi { type: 'store'; 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 d8740a345d..cefa74d5ee 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 @@ -7,7 +7,7 @@ import { UmbModalBaseElement, } 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'; +import { UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT } 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') @@ -53,7 +53,7 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement< super.connectedCallback(); // 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.consumeContext(UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT, (instance) => { this.observe( instance.byId(this.data?.documentTypeId), (documentType) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/document-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/document-type-picker-modal.token.ts index 33db1db4d4..3f126242dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/document-type-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/document-type-picker-modal.token.ts @@ -14,6 +14,6 @@ export const UMB_DOCUMENT_TYPE_PICKER_MODAL = new UmbModalToken< size: 'small', }, { - treeAlias: 'Umb.Tree.DocumentTypes', + treeAlias: 'Umb.Tree.DocumentType', }, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts index 0f482af443..77227e517f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/index.ts @@ -5,7 +5,5 @@ export * from './data-source.interface.js'; export * from './extend-data-source-paged-response-data.function.js'; export * from './extend-data-source-response-data.function.js'; export * from './folder-data-source.interface.js'; -export * from './item-data-source.interface.js'; export * from './move-data-source.interface.js'; -export * from './tree-data-source.interface.js'; export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/item-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/item-data-source.interface.ts deleted file mode 100644 index 88fb741ee3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/item-data-source.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; - -export interface UmbItemDataSource { - getItems(unique: Array): Promise>>; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/tree-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/tree-data-source.interface.ts deleted file mode 100644 index b973f626b7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/tree-data-source.interface.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { UmbPagedData } from './types.js'; -import type { DataSourceResponse } from './data-source-response.interface.js'; - -export interface UmbTreeDataSource> { - getRootItems(): Promise>; - getChildrenOf(parentUnique: string | null): Promise>; - // TODO: remove this when all repositories are migrated to the new items interface - getItems(unique: Array): Promise>>; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/types.ts index 18876c86af..62454b9ebe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source/types.ts @@ -1,4 +1,4 @@ export interface UmbPagedData { total: number; items: Array; -} \ No newline at end of file +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts index 4c2749bd4d..d39abba3d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts @@ -1,10 +1,10 @@ export * from './data-source/index.js'; export * from './detail-repository.interface.js'; -export * from './tree-repository.interface.js'; export * from './folder-repository.interface.js'; export * from './collection-repository.interface.js'; -export * from './item-repository.interface.js'; export * from './move-repository.interface.js'; export * from './copy-repository.interface.js'; export * from './repository-items.manager.js'; export * from './repository-base.js'; + +export * from './item/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/index.ts new file mode 100644 index 0000000000..024ad912f7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/index.ts @@ -0,0 +1,3 @@ +export * from './item-data-source.interface.js'; +export * from './item-repository-base.js'; +export * from './item-repository.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-data-source.interface.ts new file mode 100644 index 0000000000..536adc18df --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-data-source.interface.ts @@ -0,0 +1,9 @@ +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbItemDataSourceConstructor { + new (host: UmbControllerHost): UmbItemDataSource; +} +export interface UmbItemDataSource { + getItems(unique: Array): Promise>>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository-base.ts new file mode 100644 index 0000000000..f7a3ca00bb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository-base.ts @@ -0,0 +1,55 @@ +import { UmbRepositoryBase } from '../repository-base.js'; +import { UmbItemDataSource, UmbItemDataSourceConstructor } from './item-data-source.interface.js'; +import { UmbItemRepository } from './item-repository.interface.js'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemStore } from '@umbraco-cms/backoffice/store'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export class UmbItemRepositoryBase extends UmbRepositoryBase implements UmbItemRepository { + protected _init: Promise; + protected _itemStore?: UmbItemStore; + #itemSource: UmbItemDataSource; + + constructor( + host: UmbControllerHost, + itemSource: UmbItemDataSourceConstructor, + itemStoreContextAlias: string | UmbContextToken, + ) { + super(host); + this.#itemSource = new itemSource(host); + + this._init = this.consumeContext(itemStoreContextAlias, (instance) => { + this._itemStore = instance as UmbItemStore; + }).asPromise(); + } + + /** + * Requests the items for the given uniques + * @param {Array} uniques + * @return {*} + * @memberof UmbItemRepositoryBase + */ + async requestItems(uniques: Array) { + if (!uniques) throw new Error('Uniques are missing'); + await this._init; + + const { data, error } = await this.#itemSource.getItems(uniques); + + if (data) { + this._itemStore!.appendItems(data); + } + + return { data, error, asObservable: () => this._itemStore!.items(uniques) }; + } + + /** + * Returns a promise with an observable of the items for the given uniques + * @param {Array} uniques + * @return {*} + * @memberof UmbItemRepositoryBase + */ + async items(uniques: Array) { + await this._init; + return this._itemStore!.items(uniques); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/item-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository.interface.ts similarity index 66% rename from src/Umbraco.Web.UI.Client/src/packages/core/repository/item-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository.interface.ts index 344fc7bc14..9f90e33748 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/item-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository.interface.ts @@ -1,8 +1,8 @@ import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { ItemResponseModelBaseModel, ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; +import { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export interface UmbItemRepository extends UmbApi { +export interface UmbItemRepository extends UmbApi { requestItems: (uniques: string[]) => Promise<{ data?: Array | undefined; error?: ProblemDetails | undefined; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-base.ts index 42d1504a9e..6307e6ec31 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-base.ts @@ -1,7 +1,7 @@ -import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; +import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbRepositoryBase extends UmbBaseController { - constructor(host: UmbControllerHost) { - super(host); - } -} \ No newline at end of file + constructor(host: UmbControllerHost) { + super(host); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts index d2d4439aec..f0d04ff14e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts @@ -1,4 +1,4 @@ -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbRoute, UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; import { @@ -110,8 +110,8 @@ export class UmbSectionMainViewElement extends UmbLitElement { const dashboardPath = this.#constructDashboardPath(dashboard); return html` `; })} @@ -129,8 +129,8 @@ export class UmbSectionMainViewElement extends UmbLitElement { const viewPath = this.#constructViewPath(view); return html` ${viewName} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts new file mode 100644 index 0000000000..c766960bbf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-item.store.ts @@ -0,0 +1,31 @@ +import { UmbStoreBase } from './store-base.js'; +import { UmbItemStore } from './item-store.interface.js'; +import type { FileItemResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +/** + * @export + * @class UmbFileSystemItemStore + * @extends {UmbStoreBase} + * @description - Data Store for File system items + */ + +export class UmbFileSystemItemStore + extends UmbStoreBase + implements UmbItemStore +{ + constructor(host: UmbControllerHost, storeAlias: string) { + super(host, storeAlias, new UmbArrayState([], (x) => x.path)); + } + + /** + * Return an observable to observe file system items + * @param {Array} paths + * @return {*} + * @memberof UmbFileSystemItemStore + */ + items(paths: Array) { + return this._data.asObservablePart((items) => items.filter((item) => paths.includes(item.path ?? ''))); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts index e7a8e58d35..54e9c0c197 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts @@ -1,8 +1,6 @@ -export * from './entity-tree-store.js'; -export * from './file-system-tree.store.js'; export * from './item-store.interface.js'; export * from './store-base.js'; export * from './store.interface.js'; export * from './store.js'; -export * from './tree-store.interface.js'; export * from './entity-item.store.js'; +export * from './file-system-item.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/entity-tree-store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree-store.ts similarity index 92% rename from src/Umbraco.Web.UI.Client/src/packages/core/store/entity-tree-store.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree-store.ts index b758aeb297..308f746b9d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/entity-tree-store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-tree-store.ts @@ -1,5 +1,5 @@ -import { UmbStoreBase } from './store-base.js'; -import type { UmbTreeStore } from './tree-store.interface.js'; +import { type UmbTreeStore } from './tree-store.interface.js'; +import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/file-system-tree.store.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-tree.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/file-system-tree.store.ts index c78093184d..db22d8e8a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/file-system-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/file-system-tree.store.ts @@ -1,5 +1,5 @@ -import { UmbStoreBase } from './store-base.js'; -import { UmbTreeStore } from './tree-store.interface.js'; +import { type UmbTreeStore } from './tree-store.interface.js'; +import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -31,9 +31,11 @@ export class UmbFileSystemTreeStore * @memberof UmbFileSystemTreeStore */ childrenOf(parentPath: string | null) { - return this._data.asObservablePart((items) => - items.filter((item) => item.path?.startsWith(parentPath + '/') || parentPath === null) - ); + if (parentPath === null) { + return this.rootItems; + } + + return this._data.asObservablePart((items) => items.filter((item) => item.path?.startsWith(parentPath + '/'))); } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index 459db5fb37..5f775743d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -1,3 +1,4 @@ +export * from './components/index.js'; export * from './entity-tree-item/index.js'; export * from './file-system-tree-item/index.js'; export * from './tree-item/index.js'; @@ -5,19 +6,11 @@ export * from './tree-item-base/index.js'; export * from './tree-menu-item/index.js'; export * from './tree.context.js'; export * from './tree.element.js'; -export * from './components/index.js'; +export * from './types.js'; +export * from './tree-repository.interface.js'; +export * from './tree-data-source.interface.js'; +export * from './tree-store.interface.js'; +export * from './entity-tree-store.js'; +export * from './file-system-tree.store.js'; -export interface UmbTreeRootModel { - type: string; - name: string; - hasChildren: boolean; - icon?: string; -} - -export interface UmbTreeRootEntityModel extends UmbTreeRootModel { - id: string | null; -} - -export interface UmbTreeRootFileSystemModel extends UmbTreeRootModel { - path: string | null; -} +export { UmbTreeRepositoryBase } from './tree-repository-base.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-data-source.interface.ts new file mode 100644 index 0000000000..07a08c2d7f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-data-source.interface.ts @@ -0,0 +1,14 @@ +import type { UmbPagedData, DataSourceResponse } from '@umbraco-cms/backoffice/repository'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export interface UmbTreeDataSourceConstructor { + new (host: UmbControllerHost): UmbTreeDataSource; +} + +export interface UmbTreeDataSource { + getTreeRoot?(): Promise>; + getRootItems(): Promise>>; + getChildrenOf(parentUnique: string | null): Promise>>; + // TODO: remove this when all repositories are migrated to the new items interface + getItems(unique: Array): Promise>>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository-base.ts new file mode 100644 index 0000000000..28741c462f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository-base.ts @@ -0,0 +1,104 @@ +import { UmbTreeStore } from './tree-store.interface.js'; +import type { UmbEntityTreeItemModel, UmbEntityTreeRootModel } from './types.js'; +import { UmbTreeRepository } from './tree-repository.interface.js'; +import type { UmbTreeDataSource, UmbTreeDataSourceConstructor } from './tree-data-source.interface.js'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export class UmbTreeRepositoryBase< + TreeItemType extends UmbEntityTreeItemModel, + TreeRootType extends UmbEntityTreeRootModel, + > + extends UmbRepositoryBase + implements UmbTreeRepository, UmbApi +{ + protected _init: Promise; + protected _treeStore?: UmbTreeStore; + #treeSource: UmbTreeDataSource; + + constructor( + host: UmbControllerHost, + treeSource: UmbTreeDataSourceConstructor, + treeStoreContextAlias: string | UmbContextToken, + ) { + super(host); + this.#treeSource = new treeSource(this); + + this._init = this.consumeContext(treeStoreContextAlias, (instance) => { + this._treeStore = instance as UmbTreeStore; + }).asPromise(); + } + + /** + * Request the tree root item + * @return {*} + * @memberof UmbTreeRepositoryBase + */ + async requestTreeRoot() { + if (!this.#treeSource.getTreeRoot?.()) { + return { data: undefined, error: undefined }; + } + + return this.#treeSource.getTreeRoot(); + } + + /** + * Requests root items of a tree + * @return {*} + * @memberof UmbTreeRepositoryBase + */ + async requestRootTreeItems() { + await this._init; + + const { data, error } = await this.#treeSource.getRootItems(); + + if (data) { + this._treeStore!.appendItems(data.items); + } + + return { data, error, asObservable: () => this._treeStore!.rootItems }; + } + + /** + * Requests tree items of a given parent + * @param {(string | null)} parentUnique + * @return {*} + * @memberof UmbTreeRepositoryBase + */ + async requestTreeItemsOf(parentUnique: string | null) { + if (parentUnique === undefined) throw new Error('Parent unique is missing'); + await this._init; + + const { data, error } = await this.#treeSource.getChildrenOf(parentUnique); + + if (data) { + this._treeStore!.appendItems(data.items); + } + + return { data, error, asObservable: () => this._treeStore!.childrenOf(parentUnique) }; + } + + /** + * Returns a promise with an observable of tree root items + * @return {*} + * @memberof UmbTreeRepositoryBase + */ + async rootTreeItems() { + await this._init; + return this._treeStore!.rootItems; + } + + /** + * Returns a promise with an observable of children items of a given parent + * @param {(string | null)} parentUnique + * @return {*} + * @memberof UmbTreeRepositoryBase + */ + async treeItemsOf(parentUnique: string | null) { + if (parentUnique === undefined) throw new Error('Parent unique is missing'); + await this._init; + return this._treeStore!.childrenOf(parentUnique); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository.interface.ts similarity index 68% rename from src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository.interface.ts index 46f52b5f06..db89e96c87 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/tree-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository.interface.ts @@ -1,30 +1,39 @@ -import { type UmbPagedData } from './data-source/types.js'; +import type { UmbTreeItemModelBase, UmbTreeItemModel, UmbEntityTreeRootModel } from './types.js'; +import type { UmbPagedData } from '@umbraco-cms/backoffice/repository'; import { type Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import type { UmbTreeRootEntityModel, UmbTreeRootModel } from '@umbraco-cms/backoffice/tree'; -import { ProblemDetails, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export interface UmbTreeRepository< - TreeItemType extends EntityTreeItemResponseModel, - TreeRootType extends UmbTreeRootModel = UmbTreeRootEntityModel + TreeItemType extends UmbTreeItemModel = UmbTreeItemModel, + TreeRootType extends UmbTreeItemModelBase = UmbEntityTreeRootModel, > extends UmbApi { requestTreeRoot: () => Promise<{ data?: TreeRootType; error?: ProblemDetails; }>; - requestRootTreeItems: () => Promise<{ - data?: UmbPagedData; - error?: ProblemDetails; - asObservable?: () => Observable; - }>; - requestTreeItemsOf: (parentUnique: string | null) => Promise<{ data?: UmbPagedData; error?: ProblemDetails; asObservable?: () => Observable; }>; + treeItemsOf: (parentUnique: string | null) => Promise>; + + /* TODO: remove this. It is not used client side. + Logic to call the root endpoint should be in the data source + because it is a server decision to split them + */ + requestRootTreeItems: () => Promise<{ + data?: UmbPagedData; + error?: ProblemDetails; + asObservable?: () => Observable; + }>; + + // TODO: remove + rootTreeItems: () => Promise>; + // TODO: remove this when all repositories are migrated to the new interface items interface requestItemsLegacy?: (uniques: string[]) => Promise<{ data?: Array; @@ -32,10 +41,6 @@ export interface UmbTreeRepository< asObservable?: () => Observable; }>; - rootTreeItems: () => Promise>; - - treeItemsOf: (parentUnique: string | null) => Promise>; - // TODO: remove this when all repositories are migrated to the new items interface itemsLegacy?: (uniques: string[]) => Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/tree-store.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-store.interface.ts similarity index 90% rename from src/Umbraco.Web.UI.Client/src/packages/core/store/tree-store.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-store.interface.ts index 2755980924..5a801a2e3c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/tree-store.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-store.interface.ts @@ -1,4 +1,4 @@ -import { UmbStore } from './store.interface.js'; +import { UmbStore } from '@umbraco-cms/backoffice/store'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import { TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts index c2de1932a9..42bb903267 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts @@ -1,15 +1,21 @@ +import { type UmbTreeItemModelBase } from './types.js'; +import { type UmbTreeRepository } from './tree-repository.interface.js'; import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { UmbPagedData, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; -import { type ManifestRepository, type ManifestTree, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbPagedData } from '@umbraco-cms/backoffice/repository'; +import { + type ManifestRepository, + type ManifestTree, + umbExtensionsRegistry, +} from '@umbraco-cms/backoffice/extension-registry'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; -import { ProblemDetails, TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; +import { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; // TODO: update interface -export interface UmbTreeContext extends UmbBaseController { +export interface UmbTreeContext extends UmbBaseController { readonly selectable: Observable; readonly selection: Observable>; setSelectable(value: boolean): void; @@ -27,7 +33,7 @@ export interface UmbTreeContext }>; } -export class UmbTreeContextBase +export class UmbTreeContextBase extends UmbBaseController implements UmbTreeContext { @@ -153,9 +159,15 @@ export class UmbTreeContextBase const repositoryAlias = treeManifest.meta.repositoryAlias; if (!repositoryAlias) throw new Error('Tree must have a repository alias.'); - new UmbExtensionApiInitializer>>(this, umbExtensionsRegistry, repositoryAlias, [this._host], (permitted, ctrl) => { - this.repository = permitted ? ctrl.api : undefined; - this.#checkIfInitialized(); - }); + new UmbExtensionApiInitializer>>( + this, + umbExtensionsRegistry, + repositoryAlias, + [this._host], + (permitted, ctrl) => { + this.repository = permitted ? ctrl.api : undefined; + this.#checkIfInitialized(); + }, + ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/types.ts new file mode 100644 index 0000000000..034616be1e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/types.ts @@ -0,0 +1,27 @@ +export interface UmbTreeItemModelBase { + type?: string; // TODO: remove option to be undefined when we have our own types + name?: string; + hasChildren?: boolean; + icon?: string | null; +} + +export interface UmbTreeItemModel extends UmbTreeItemModelBase { + parentId?: string | null; // TODO: remove option to be undefined when server returns the same or when we get our own types +} + +export interface UmbEntityTreeItemModel extends UmbTreeItemModel { + id?: string; // TODO: remove option to be undefined when server returns the same or when we get our own types +} + +export interface UmbFileSystemTreeItemModel extends UmbTreeItemModel { + path?: string; // TODO: remove option to be undefined when server returns the same or when we get our own types +} + +// Root +export interface UmbEntityTreeRootModel extends UmbTreeItemModelBase { + id: null; +} + +export interface UmbFileSystemTreeRootModel extends UmbTreeItemModelBase { + path: null; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/entity-actions/create/create.action.ts index a6adcf55ac..7eed91c078 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/entity-actions/create/create.action.ts @@ -1,54 +1,16 @@ import { UmbDictionaryRepository } from '../../repository/dictionary.repository.js'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; -import { UmbSectionSidebarContext, UMB_SECTION_SIDEBAR_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/section'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { - UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_CREATE_DICTIONARY_MODAL, -} from '@umbraco-cms/backoffice/modal'; export default class UmbCreateDictionaryEntityAction extends UmbEntityActionBase { static styles = [UmbTextStyles]; - #modalContext?: UmbModalManagerContext; - - #sectionSidebarContext!: UmbSectionSidebarContext; - constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { - this.#modalContext = instance; - }); - - this.consumeContext(UMB_SECTION_SIDEBAR_CONTEXT_TOKEN, (instance) => { - this.#sectionSidebarContext = instance; - }); } async execute() { - // TODO: what to do if modal service is not available? - if (!this.#modalContext) return; - if (!this.repository) return; - - // TODO: how can we get the current entity detail in the modal? Passing the observable - // feels a bit hacky. Works, but hacky. - const modalContext = this.#modalContext?.open(UMB_CREATE_DICTIONARY_MODAL, { - parentId: this.unique, - parentName: this.#sectionSidebarContext.headline, - }); - - const { name, parentId } = await modalContext.onSubmit(); - if (!name || parentId === undefined) return; - - const { data: url } = await this.repository.create({ name, parentId }); - if (!url) return; - - //TODO: Why do we need to extract the id like this? - const id = url.substring(url.lastIndexOf('/') + 1); - - history.pushState({}, '', `/section/dictionary/workspace/dictionary-item/edit/${id}`); + history.pushState({}, '', `/section/dictionary/workspace/dictionary-item/create/${this.unique ?? 'null'}`); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts index 66ecced7f3..20b477b99e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.repository.ts @@ -3,7 +3,8 @@ import { UmbDictionaryDetailServerDataSource } from './sources/dictionary.detail import { UmbDictionaryTreeStore, UMB_DICTIONARY_TREE_STORE_CONTEXT_TOKEN } from './dictionary.tree.store.js'; import { UmbDictionaryTreeServerDataSource } from './sources/dictionary.tree.server.data.js'; import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { CreateDictionaryItemRequestModel, DictionaryOverviewResponseModel, @@ -14,7 +15,8 @@ import { import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbDictionaryRepository extends UmbBaseController +export class UmbDictionaryRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository< @@ -109,6 +111,20 @@ export class UmbDictionaryRepository extends UmbBaseController return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } + async requestItems(ids: Array) { + // TODO: There is a bug where the item gets removed from the tree before we confirm the delete via the modal. It doesn't delete the item unless we confirm the delete. + if (!ids) throw new Error('Dictionary Ids are missing'); + await this.#init; + + const { data, error } = await this.#treeSource.getItems(ids); + + if (data) { + this.#treeStore?.appendItems(data); + } + + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; + } + async rootTreeItems() { await this.#init; return this.#treeStore!.rootItems; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.tree.store.ts index c2d19b876e..d05e19af5d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/dictionary.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; /** @@ -20,5 +20,5 @@ export class UmbDictionaryTreeStore extends UmbEntityTreeStore { } export const UMB_DICTIONARY_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbDictionaryTreeStore' + 'UmbDictionaryTreeStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/sources/dictionary.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/sources/dictionary.tree.server.data.ts index bc086e704c..04278012f8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/sources/dictionary.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/repository/sources/dictionary.tree.server.data.ts @@ -1,6 +1,6 @@ import { DictionaryResource } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -48,7 +48,7 @@ export class UmbDictionaryTreeServerDataSource implements UmbTreeDataSource { this.#host, DictionaryResource.getTreeDictionaryChildren({ parentId, - }) + }), ); } } @@ -68,7 +68,7 @@ export class UmbDictionaryTreeServerDataSource implements UmbTreeDataSource { this.#host, DictionaryResource.getDictionaryItem({ id: ids, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts index fd0038e759..492b157e66 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts @@ -68,9 +68,8 @@ export class UmbDictionaryWorkspaceContext const { data } = await this.repository.createScaffold(parentId); if (!data) return; this.setIsNew(true); - // TODO: This is a hack to get around the fact that the data is not typed correctly. - // Create and response models are different. We need to look into this. - this.#data.next(data as unknown as DictionaryItemResponseModel); + + this.#data.next(data as DictionaryItemResponseModel); } async save() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.element.ts index d4246170bf..be1cbe2647 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.element.ts @@ -26,7 +26,6 @@ export class UmbWorkspaceDictionaryElement extends UmbLitElement { component: () => this.#element, setup: async (_component, info) => { const parentId = info.match.params.parentId === 'null' ? null : info.match.params.parentId; - await this.#workspaceContext.create(parentId); new UmbWorkspaceIsNewRedirectController( diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/document-blueprint.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/document-blueprint.tree.store.ts index 8f903b6402..07f07c4f20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/document-blueprint.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/document-blueprint.tree.store.ts @@ -1,9 +1,9 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbDocumentBlueprintTreeStore' + 'UmbDocumentBlueprintTreeStore', ); /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.context.ts new file mode 100644 index 0000000000..ea7686dc2a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.context.ts @@ -0,0 +1,11 @@ +import { DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UmbPickerInputContext } from '@umbraco-cms/backoffice/picker-input'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UMB_DOCUMENT_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { DocumentTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbDocumentTypePickerContext extends UmbPickerInputContext { + constructor(host: UmbControllerHostElement) { + super(host, DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, UMB_DOCUMENT_TYPE_PICKER_MODAL); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.element.ts new file mode 100644 index 0000000000..440723d165 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.element.ts @@ -0,0 +1,143 @@ +import { UmbDocumentTypePickerContext } from './document-type-input.context.js'; +import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { DocumentTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +@customElement('umb-document-type-input') +export class UmbDocumentTypeInputElement extends FormControlMixin(UmbLitElement) { + /** + * This is a minimum amount of selected items in this input. + * @type {number} + * @attr + * @default 0 + */ + @property({ type: Number }) + public get min(): number { + return this.#pickerContext.min; + } + public set min(value: number) { + this.#pickerContext.min = value; + } + + /** + * Min validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + minMessage = 'This field need more items'; + + /** + * This is a maximum amount of selected items in this input. + * @type {number} + * @attr + * @default Infinity + */ + @property({ type: Number }) + public get max(): number { + return this.#pickerContext.max; + } + public set max(value: number) { + this.#pickerContext.max = value; + } + + /** + * Max validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + maxMessage = 'This field exceeds the allowed amount of items'; + + public get selectedIds(): Array { + return this.#pickerContext.getSelection(); + } + public set selectedIds(ids: Array) { + this.#pickerContext.setSelection(ids); + } + + @property() + public set value(idsString: string) { + // Its with full purpose we don't call super.value, as thats being handled by the observation of the context selection. + this.selectedIds = idsString.split(/[ ,]+/); + } + + @property() + get pickableFilter() { + return this.#pickerContext.pickableFilter; + } + set pickableFilter(newVal) { + this.#pickerContext.pickableFilter = newVal; + } + + @state() + private _items?: Array; + + #pickerContext = new UmbDocumentTypePickerContext(this); + + constructor() { + super(); + + this.addValidator( + 'rangeUnderflow', + () => this.minMessage, + () => !!this.min && this.#pickerContext.getSelection().length < this.min, + ); + + this.addValidator( + 'rangeOverflow', + () => this.maxMessage, + () => !!this.max && this.#pickerContext.getSelection().length > this.max, + ); + + this.observe(this.#pickerContext.selection, (selection) => (super.value = selection.join(','))); + this.observe(this.#pickerContext.selectedItems, (selectedItems) => (this._items = selectedItems)); + } + + protected getFormElement() { + return undefined; + } + + render() { + return html` + ${this._items?.map((item) => this._renderItem(item))} + this.#pickerContext.openPicker()} label="open" + >Add + `; + } + + private _renderItem(item: DocumentTypeItemResponseModel) { + if (!item.id) return; + return html` + + + this.#pickerContext.requestRemoveItem(item.id!)} + label="Remove Document Type ${item.name}" + >Remove + + + `; + } + + static styles = [ + css` + #add-button { + width: 100%; + } + `, + ]; +} + +export default UmbDocumentTypeInputElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-type-input': UmbDocumentTypeInputElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/index.ts index be24cd45e5..d0e3e2cad3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/index.ts @@ -1 +1 @@ -import './input-document-type/input-document-type.element.js'; +import './document-type-input/document-type-input.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts deleted file mode 100644 index a577d7a9a8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { - UmbDocumentTypeTreeStore, - UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN, -} from '../../repository/document-type.tree.store.js'; -import { css, html, nothing, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; -import { DocumentTypeResponseModel, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { - UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_CONFIRM_MODAL, - UMB_DOCUMENT_TYPE_PICKER_MODAL, -} from '@umbraco-cms/backoffice/modal'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; - -@customElement('umb-input-document-type') -export class UmbInputDocumentTypeElement extends FormControlMixin(UmbLitElement) { - // TODO: do we need both selectedIds and value? If we just use value we follow the same pattern as native form controls. - private _selectedIds: Array = []; - @property({ type: Array }) - public get selectedIds(): Array { - return this._selectedIds; - } - public set selectedIds(ids: Array) { - this._selectedIds = ids ?? []; - super.value = this._selectedIds.join(','); - this._observePickedDocuments(); - } - - @property() - public set value(idsString: string) { - if (idsString !== this._value) { - this.selectedIds = idsString.split(/[ ,]+/); - } - } - - @state() - private _items?: Array; - - private _modalContext?: UmbModalManagerContext; - private _documentTypeStore?: UmbDocumentTypeTreeStore; - private _pickedItemsObserver?: UmbObserverController; - - constructor() { - super(); - this.consumeContext(UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN, (instance) => { - this._documentTypeStore = instance; - this._observePickedDocuments(); - }); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { - this._modalContext = instance; - }); - } - - protected getFormElement() { - return undefined; - } - - private _observePickedDocuments() { - this._pickedItemsObserver?.destroy(); - - if (!this._documentTypeStore) return; - - // TODO: consider changing this to the list data endpoint when it is available - this._pickedItemsObserver = this.observe(this._documentTypeStore.items(this._selectedIds), (items) => { - this._items = items; - }); - } - - private _openPicker() { - // We send a shallow copy(good enough as its just an array of ids) of our this._selectedIds, as we don't want the modal to manipulate our data: - const modalContext = this._modalContext?.open(UMB_DOCUMENT_TYPE_PICKER_MODAL, { - multiple: true, - selection: [...this._selectedIds], - }); - - modalContext?.onSubmit().then(({ selection }: any) => { - this._setSelection(selection); - }); - } - - private async _removeItem(item: DocumentTypeResponseModel) { - const modalContext = this._modalContext?.open(UMB_CONFIRM_MODAL, { - color: 'danger', - headline: `Remove ${item.name}?`, - content: 'Are you sure you want to remove this item', - confirmLabel: 'Remove', - }); - - await modalContext?.onSubmit(); - const newSelection = this._selectedIds.filter((value) => value !== item.id); - this._setSelection(newSelection); - } - - private _setSelection(newSelection: Array) { - this.selectedIds = newSelection; - this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); - } - - render() { - return html` - ${this._items?.map((item) => this._renderItem(item))} - Add - `; - } - - private _renderItem(item: DocumentTypeResponseModel) { - // TODO: remove when we have a way to handle trashed items - const tempItem = item as DocumentTypeResponseModel & { isTrashed: boolean }; - - return html` - - - ${tempItem.isTrashed ? html` Trashed ` : nothing} - - this._removeItem(item)} label="Remove document ${item.name}">Remove - - - `; - } - - static styles = [ - css` - #add-button { - width: 100%; - } - `, - ]; -} - -export default UmbInputDocumentTypeElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-input-document-type': UmbInputDocumentTypeElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/create.action.ts index 8504d237b6..ffb76adc49 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/create.action.ts @@ -1,10 +1,10 @@ -import { UmbDocumentTypeRepository } from '../../repository/document-type.repository.js'; +import { UmbDocumentTypeDetailRepository } from '../../repository/detail/document-type-detail.repository.js'; import { UMB_DOCUMENT_TYPE_CREATE_OPTIONS_MODAL } from './modal/index.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; -export class UmbCreateDataTypeEntityAction extends UmbEntityActionBase { +export class UmbCreateDataTypeEntityAction extends UmbEntityActionBase { #modalManagerContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts index 8bd1bc0b02..3d41552178 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts @@ -3,7 +3,7 @@ import { DOCUMENT_TYPE_FOLDER_ENTITY_TYPE, DOCUMENT_TYPE_ROOT_ENTITY_TYPE, } from '../../index.js'; -import { DOCUMENT_TYPE_REPOSITORY_ALIAS } from '../../repository/manifests.js'; +import { DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UmbCreateDataTypeEntityAction } from './create.action.js'; import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -17,7 +17,7 @@ const entityActions: Array = [ meta: { icon: 'icon-add', label: 'Create...', - repositoryAlias: DOCUMENT_TYPE_REPOSITORY_ALIAS, + repositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, entityTypes: [DOCUMENT_TYPE_ENTITY_TYPE, DOCUMENT_TYPE_ROOT_ENTITY_TYPE, DOCUMENT_TYPE_FOLDER_ENTITY_TYPE], }, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts index 851ccbe898..3f42a95d47 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/modal/document-type-create-options-modal.element.ts @@ -1,7 +1,7 @@ -import { DOCUMENT_TYPE_REPOSITORY_ALIAS } from '../../../repository/manifests.js'; +import { DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS } from '../../../repository/index.js'; import { UmbDocumentTypeCreateOptionsModalData } from './index.js'; import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalManagerContext, UmbModalContext, @@ -30,7 +30,7 @@ export class UmbDataTypeCreateOptionsModalElement extends UmbLitElement { #onClick(event: PointerEvent) { event.stopPropagation(); const folderModalHandler = this.#modalContext?.open(UMB_FOLDER_MODAL, { - repositoryAlias: DOCUMENT_TYPE_REPOSITORY_ALIAS, + repositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, }); folderModalHandler?.onSubmit().then(() => this.modalContext?.submit()); } 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 9bacdef5c8..752841e901 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 @@ -1,4 +1,4 @@ -import { DOCUMENT_TYPE_REPOSITORY_ALIAS } from '../repository/manifests.js'; +import { DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import { manifests as createManifests } from './create/manifests.js'; import { UmbCopyEntityAction, @@ -20,7 +20,7 @@ const entityActions: Array = [ meta: { icon: 'icon-trash', label: 'Delete', - repositoryAlias: DOCUMENT_TYPE_REPOSITORY_ALIAS, + repositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, entityTypes: [entityType], }, }, @@ -33,7 +33,7 @@ const entityActions: Array = [ meta: { icon: 'icon-enter', label: 'Move', - repositoryAlias: DOCUMENT_TYPE_REPOSITORY_ALIAS, + repositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, entityTypes: [entityType], }, }, @@ -46,7 +46,7 @@ const entityActions: Array = [ meta: { icon: 'icon-documents', label: 'Copy', - repositoryAlias: DOCUMENT_TYPE_REPOSITORY_ALIAS, + repositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, entityTypes: [entityType], }, }, @@ -59,7 +59,7 @@ const entityActions: Array = [ meta: { icon: 'icon-navigation-vertical', label: 'Sort', - repositoryAlias: DOCUMENT_TYPE_REPOSITORY_ALIAS, + repositoryAlias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, entityTypes: [entityType], }, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/menu-item/manifests.ts index 1cc933fe54..e4c8e626aa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/menu-item/manifests.ts @@ -1,3 +1,4 @@ +import { DOCUMENT_TYPE_TREE_ALIAS } from '../tree/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestTypes = { @@ -7,7 +8,7 @@ const menuItem: ManifestTypes = { name: 'Document Types Menu Item', weight: 900, meta: { - treeAlias: 'Umb.Tree.DocumentTypes', + treeAlias: DOCUMENT_TYPE_TREE_ALIAS, label: 'Document Types', icon: 'icon-folder', menus: ['Umb.Menu.Settings'], 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/detail/document-type-detail.repository.ts similarity index 59% rename from src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.repository.ts index cc19105e92..28c670fb77 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/detail/document-type-detail.repository.ts @@ -1,16 +1,12 @@ -import { UmbDocumentTypeTreeServerDataSource } from './sources/document-type.tree.server.data.js'; -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 { UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT, UmbDocumentTypeTreeStore } from '../../tree/document-type.tree.store.js'; +import { UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT, UmbDocumentTypeItemStore } from '../item/document-type-item.store.js'; +import { UmbDocumentTypeServerDataSource } from './document-type.server.data.js'; +import { UmbDocumentTypeDetailStore, UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT } from './document-type-detail.store.js'; +import { type UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; import { UmbBaseController, type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { CreateDocumentTypeRequestModel, DocumentTypeResponseModel, - EntityTreeItemResponseModel, FolderTreeItemResponseModel, UpdateDocumentTypeRequestModel, } from '@umbraco-cms/backoffice/backend-api'; @@ -19,21 +15,19 @@ import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; type ItemType = DocumentTypeResponseModel; -export class UmbDocumentTypeRepository extends UmbBaseController +export class UmbDocumentTypeDetailRepository + extends UmbBaseController implements - UmbTreeRepository, UmbDetailRepository, UmbApi { #init!: Promise; - #treeSource: UmbTreeDataSource; #treeStore?: UmbDocumentTypeTreeStore; #detailDataSource: UmbDocumentTypeServerDataSource; - #detailStore?: UmbDocumentTypeStore; + #detailStore?: UmbDocumentTypeDetailStore; - #itemSource: UmbDocumentTypeItemServerDataSource; #itemStore?: UmbDocumentTypeItemStore; #notificationContext?: UmbNotificationContext; @@ -42,20 +36,18 @@ export class UmbDocumentTypeRepository extends UmbBaseController super(host); // TODO: figure out how spin up get the correct data source - this.#treeSource = new UmbDocumentTypeTreeServerDataSource(this); this.#detailDataSource = new UmbDocumentTypeServerDataSource(this); - this.#itemSource = new UmbDocumentTypeItemServerDataSource(this); this.#init = Promise.all([ - this.consumeContext(UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT, (instance) => { this.#treeStore = instance; }), - this.consumeContext(UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT, (instance) => { this.#detailStore = instance; }), - this.consumeContext(UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT, (instance) => { this.#itemStore = instance; }), @@ -65,86 +57,6 @@ export class UmbDocumentTypeRepository extends UmbBaseController ]); } - // TODO: Move - async requestTreeRoot() { - await this.#init; - - const data = { - id: null, - type: 'document-type-root', - name: 'Document Types', - icon: 'icon-folder', - hasChildren: true, - }; - - return { data }; - } - - async requestRootTreeItems() { - await this.#init; - - const { data, error } = await this.#treeSource.getRootItems(); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - return { data, error, asObservable: () => this.#treeStore!.rootItems }; - } - - async requestTreeItemsOf(parentId: string | null) { - await this.#init; - if (parentId === undefined) throw new Error('Parent id is missing'); - - const { data, error } = await this.#treeSource.getChildrenOf(parentId); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - 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; - - if (!ids) { - throw new Error('Ids are missing'); - } - - const { data, error } = await this.#treeSource.getItems(ids); - - return { data, error, asObservable: () => this.#treeStore!.items(ids) }; - } - - async rootTreeItems() { - await this.#init; - return this.#treeStore!.rootItems; - } - - async treeItemsOf(parentId: string | null) { - await this.#init; - return this.#treeStore!.childrenOf(parentId); - } - - async itemsLegacy(ids: Array) { - await this.#init; - return this.#treeStore!.items(ids); - } - // DETAILS: async createScaffold(parentId: string | null) { @@ -241,7 +153,7 @@ export class UmbDocumentTypeRepository extends UmbBaseController // 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.#detailStore?.removeItem(id); this.#treeStore?.removeItem(id); this.#itemStore?.removeItem(id); } 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/detail/document-type-detail.store.ts similarity index 52% rename from src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.store.ts index 5e9abda97d..8f021c86b7 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/detail/document-type-detail.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 UmbDocumentTypeDetailStore extends UmbStoreBase { /** * Creates an instance of UmbDocumentTypeStore. * @param {UmbControllerHostElement} host @@ -19,37 +19,21 @@ export class UmbDocumentTypeStore extends UmbStoreBase([], (x) => x.id) + UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT.toString(), + new UmbArrayState([], (x) => x.id), ); } /** - * Append a document-type to the store - * @param {DocumentTypeModel} document - * @memberof UmbDocumentTypeStore - */ - append(document: DocumentTypeResponseModel) { - this._data.append([document]); - } - - /** - * Append a document-type to the store - * @param {DocumentTypeModel} document - * @memberof UmbDocumentTypeStore + * @param {DocumentTypeResponseModel['id']} id + * @return {*} + * @memberof UmbDocumentTypeDetailStore */ byId(id: DocumentTypeResponseModel['id']) { return this._data.asObservablePart((x) => x.find((y) => y.id === id)); } - - /** - * Removes document-types in the store with the given uniques - * @param {string[]} uniques - * @memberof UmbDocumentTypeStore - */ - remove(uniques: Array) { - this._data.remove(uniques); - } } -export const UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDocumentTypeStore'); +export const UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT = new UmbContextToken( + 'UmbDocumentTypeDetailStore', +); 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/detail/document-type.server.data.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/index.ts new file mode 100644 index 0000000000..5973fc062a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/index.ts @@ -0,0 +1,3 @@ +export { UmbDocumentTypeDetailRepository } from './document-type-detail.repository.js'; +export { DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, DOCUMENT_TYPE_DETAIL_STORE_ALIAS } from './manifests.js'; +export { UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT } from './document-type-detail.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/manifests.ts new file mode 100644 index 0000000000..122af47e3a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/manifests.ts @@ -0,0 +1,22 @@ +import { UmbDocumentTypeDetailRepository } from './document-type-detail.repository.js'; +import { UmbDocumentTypeDetailStore } from './document-type-detail.store.js'; +import { ManifestRepository, ManifestStore } from '@umbraco-cms/backoffice/extension-registry'; + +export const DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS = 'Umb.Repository.DocumentType.Detail'; +export const DOCUMENT_TYPE_DETAIL_STORE_ALIAS = 'Umb.Store.DocumentType.Detail'; + +const detailRepository: ManifestRepository = { + type: 'repository', + alias: DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS, + name: 'Document Types Repository', + api: UmbDocumentTypeDetailRepository, +}; + +const detailStore: ManifestStore = { + type: 'store', + alias: DOCUMENT_TYPE_DETAIL_STORE_ALIAS, + name: 'Document Type Store', + api: UmbDocumentTypeDetailStore, +}; + +export const manifests = [detailRepository, detailStore]; 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 b6bcde4a59..1f37e6d2ac 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,2 @@ -export * from './document-type.repository.js'; -export * from './document-type.store.js'; -export * from './document-type.tree.store.js'; +export * from './item/index.js'; +export * from './detail/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.repository.ts new file mode 100644 index 0000000000..1a6dba2fb0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.repository.ts @@ -0,0 +1,11 @@ +import { UmbDocumentTypeItemModel } from './types.js'; +import { UmbDocumentTypeItemServerDataSource } from './document-type-item.server.data.js'; +import { UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT } from './document-type-item.store.js'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbDocumentTypeItemRepository extends UmbItemRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbDocumentTypeItemServerDataSource, UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT); + } +} 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/item/document-type-item.server.data.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type-item.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.server.data.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/item/document-type-item.store.ts similarity index 87% rename from src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type-item.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.store.ts index e6026475a0..cfb43884f6 100644 --- 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/item/document-type-item.store.ts @@ -23,7 +23,7 @@ export class UmbDocumentTypeItemStore constructor(host: UmbControllerHostElement) { super( host, - UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT_TOKEN.toString(), + UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT.toString(), new UmbArrayState([], (x) => x.id), ); } @@ -33,6 +33,6 @@ export class UmbDocumentTypeItemStore } } -export const UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT_TOKEN = new UmbContextToken( +export const UMB_DOCUMENT_TYPE_ITEM_STORE_CONTEXT = new UmbContextToken( 'UmbDocumentTypeItemStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/index.ts new file mode 100644 index 0000000000..58828d2957 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/index.ts @@ -0,0 +1,3 @@ +export { UmbDocumentTypeItemRepository } from './document-type-item.repository.js'; +export { DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, DOCUMENT_TYPE_ITEM_STORE_ALIAS } from './manifests.js'; +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/manifests.ts new file mode 100644 index 0000000000..d30c80175d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/manifests.ts @@ -0,0 +1,22 @@ +import { UmbDocumentTypeItemRepository } from './document-type-item.repository.js'; +import { UmbDocumentTypeItemStore } from './document-type-item.store.js'; +import { ManifestItemStore, ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.DocumentType.Item'; +export const DOCUMENT_TYPE_ITEM_STORE_ALIAS = 'Umb.Store.DocumentType.Item'; + +const itemRepository: ManifestRepository = { + type: 'repository', + alias: DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, + name: 'Document Type Item Repository', + api: UmbDocumentTypeItemRepository, +}; + +const itemStore: ManifestItemStore = { + type: 'itemStore', + alias: DOCUMENT_TYPE_ITEM_STORE_ALIAS, + name: 'Document Type Item Store', + api: UmbDocumentTypeItemStore, +}; + +export const manifests = [itemRepository, itemStore]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/types.ts new file mode 100644 index 0000000000..609f911ad6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/types.ts @@ -0,0 +1,3 @@ +import { DocumentTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export type UmbDocumentTypeItemModel = DocumentTypeItemResponseModel; 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 34645f525f..bb35952020 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,46 +1,4 @@ -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 { - ManifestItemStore, - ManifestRepository, - ManifestStore, - ManifestTreeStore, -} from '@umbraco-cms/backoffice/extension-registry'; +import { manifests as detailManifests } from './detail/manifests.js'; +import { manifests as itemManifests } from './item/manifests.js'; -export const DOCUMENT_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentType'; - -const repository: ManifestRepository = { - type: 'repository', - alias: DOCUMENT_TYPE_REPOSITORY_ALIAS, - name: 'Document Types Repository', - api: UmbDocumentTypeRepository, -}; - -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', - alias: DOCUMENT_TYPE_STORE_ALIAS, - name: 'Document Type Store', - api: UmbDocumentTypeStore, -}; - -const treeStore: ManifestTreeStore = { - type: 'treeStore', - alias: DOCUMENT_TYPE_TREE_STORE_ALIAS, - name: 'Document Type Tree Store', - api: UmbDocumentTypeTreeStore, -}; - -const itemStore: ManifestItemStore = { - type: 'itemStore', - alias: DOCUMENT_TYPE_ITEM_STORE_ALIAS, - name: 'Document Type Item Store', - api: UmbDocumentTypeItemStore, -}; - -export const manifests = [repository, store, treeStore, itemStore]; +export const manifests = [...detailManifests, ...itemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts new file mode 100644 index 0000000000..8fa85338e2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts @@ -0,0 +1,28 @@ +import { DOCUMENT_TYPE_ROOT_ENTITY_TYPE } from '../index.js'; +import { UmbDocumentTypeTreeServerDataSource } from './document-type.tree.server.data-source.js'; +import { UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT } from './document-type.tree.store.js'; +import { UmbDocumentTypeTreeItemModel, UmbDocumentTypeTreeRootModel } from './types.js'; +import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbDocumentTypeTreeRepository + extends UmbTreeRepositoryBase + implements UmbApi +{ + constructor(host: UmbControllerHost) { + super(host, UmbDocumentTypeTreeServerDataSource, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT); + } + + async requestTreeRoot() { + const data = { + id: null, + type: DOCUMENT_TYPE_ROOT_ENTITY_TYPE, + name: 'Document Types', + icon: 'icon-folder', + hasChildren: true, + }; + + return { data }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type.tree.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts index 5850192cd2..b46ce80144 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/sources/document-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts @@ -1,10 +1,10 @@ -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { DocumentTypeResource } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** - * A data source for the Document tree that fetches data from the server + * A data source for the Document Type tree that fetches data from the server * @export * @class UmbDocumentTypeTreeServerDataSource * @implements {UmbTreeDataSource} @@ -12,35 +12,6 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; export class UmbDocumentTypeTreeServerDataSource implements UmbTreeDataSource { #host: UmbControllerHost; - // TODO: how do we handle trashed items? - async trashItems(ids: Array) { - // TODO: use backend cli when available. - return tryExecuteAndNotify( - this.#host, - fetch('/umbraco/management/api/v1/document-type/trash', { - method: 'POST', - body: JSON.stringify(ids), - headers: { - 'Content-Type': 'application/json', - }, - }) - ); - } - - async moveItems(ids: Array, destination: string) { - // TODO: use backend cli when available. - return tryExecuteAndNotify( - this.#host, - fetch('/umbraco/management/api/v1/document-type/move', { - method: 'POST', - body: JSON.stringify({ ids: ids, destination }), - headers: { - 'Content-Type': 'application/json', - }, - }) - ); - } - /** * Creates an instance of UmbDocumentTypeTreeServerDataSource. * @param {UmbControllerHost} host @@ -77,7 +48,7 @@ export class UmbDocumentTypeTreeServerDataSource implements UmbTreeDataSource { this.#host, DocumentTypeResource.getTreeDocumentTypeChildren({ parentId, - }) + }), ); } } @@ -97,7 +68,7 @@ export class UmbDocumentTypeTreeServerDataSource implements UmbTreeDataSource { this.#host, DocumentTypeResource.getDocumentTypeItem({ id: ids, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts similarity index 55% rename from src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.tree.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts index 3fe7e04e3d..ecafc8d4dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/document-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts @@ -1,14 +1,13 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; /** * @export * @class UmbDocumentTypeTreeStore * @extends {UmbStoreBase} - * @description - Tree Data Store for Document-Types + * @description - Tree Data Store for Document Types */ -// TODO: consider if tree store could be turned into a general EntityTreeStore class? export class UmbDocumentTypeTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbDocumentTypeTreeStore. @@ -16,10 +15,10 @@ export class UmbDocumentTypeTreeStore extends UmbEntityTreeStore { * @memberof UmbDocumentTypeTreeStore */ constructor(host: UmbControllerHostElement) { - super(host, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN.toString()); + super(host, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT.toString()); } } -export const UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbDocumentTypeTreeStore' +export const UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT = new UmbContextToken( + 'UmbDocumentTypeTreeStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts index f64254265e..23ce35e9ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts @@ -1,14 +1,36 @@ -import { DOCUMENT_TYPE_REPOSITORY_ALIAS } from '../repository/manifests.js'; -import type { ManifestTree, ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbDocumentTypeTreeRepository } from './document-type-tree.repository.js'; +import { UmbDocumentTypeTreeStore } from './document-type.tree.store.js'; +import type { + ManifestRepository, + ManifestTree, + ManifestTreeItem, + ManifestTreeStore, +} from '@umbraco-cms/backoffice/extension-registry'; -export const DOCUMENT_TYPE_TREE_ALIAS = 'Umb.Tree.DocumentTypes'; +export const DOCUMENT_TYPE_TREE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentType.Tree'; +export const DOCUMENT_TYPE_TREE_STORE_ALIAS = 'Umb.Store.DocumentType.Tree'; +export const DOCUMENT_TYPE_TREE_ALIAS = 'Umb.Tree.DocumentType'; + +const treeRepository: ManifestRepository = { + type: 'repository', + alias: DOCUMENT_TYPE_TREE_REPOSITORY_ALIAS, + name: 'Document Type Tree Repository', + api: UmbDocumentTypeTreeRepository, +}; + +const treeStore: ManifestTreeStore = { + type: 'treeStore', + alias: DOCUMENT_TYPE_TREE_STORE_ALIAS, + name: 'Document Type Tree Store', + api: UmbDocumentTypeTreeStore, +}; const tree: ManifestTree = { type: 'tree', alias: DOCUMENT_TYPE_TREE_ALIAS, - name: 'Document Types Tree', + name: 'Document Type Tree', meta: { - repositoryAlias: DOCUMENT_TYPE_REPOSITORY_ALIAS, + repositoryAlias: DOCUMENT_TYPE_TREE_REPOSITORY_ALIAS, }, }; @@ -22,4 +44,4 @@ const treeItem: ManifestTreeItem = { }, }; -export const manifests = [tree, treeItem]; +export const manifests = [treeRepository, treeStore, tree, treeItem]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/types.ts new file mode 100644 index 0000000000..98dfeb9d9a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/types.ts @@ -0,0 +1,5 @@ +import type { DocumentTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbEntityTreeItemModel, UmbEntityTreeRootModel } from '@umbraco-cms/backoffice/tree'; + +export type UmbDocumentTypeTreeItemModel = DocumentTypeTreeItemResponseModel & UmbEntityTreeItemModel; +export type UmbDocumentTypeTreeRootModel = DocumentTypeTreeItemResponseModel & UmbEntityTreeRootModel; 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 5c7db6338b..82b49c3a00 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 @@ -1,6 +1,9 @@ -import { UmbDocumentTypeRepository } from '../repository/document-type.repository.js'; +import { UmbDocumentTypeDetailRepository } from '../repository/detail/document-type-detail.repository.js'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; -import { UmbEditableWorkspaceContextBase, UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import { + UmbEditableWorkspaceContextBase, + UmbSaveableWorkspaceContextInterface, +} from '@umbraco-cms/backoffice/workspace'; import type { ContentTypeCompositionModel, ContentTypeSortModel, @@ -12,7 +15,7 @@ import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; type EntityType = DocumentTypeResponseModel; export class UmbDocumentTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbEditableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface { // Draft is located in structure manager @@ -42,7 +45,7 @@ export class UmbDocumentTypeWorkspaceContext isSorting = this.#isSorting.asObservable(); constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Workspace.DocumentType', new UmbDocumentTypeRepository(host)); + super(host, 'Umb.Workspace.DocumentType', new UmbDocumentTypeDetailRepository(host)); this.structure = new UmbContentTypePropertyStructureManager(this.host, this.repository); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts index c59d51d8ba..b94edc0dbf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts @@ -1,7 +1,7 @@ import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context.js'; -import type { UmbInputDocumentTypeElement } from '../../../components/input-document-type/input-document-type.element.js'; +import type { UmbDocumentTypeInputElement } from '../../../components/document-type-input/document-type-input.element.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UUIToggleElement } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; @@ -62,10 +62,10 @@ export class UmbDocumentTypeWorkspaceViewStructureElement
- - +
diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts index ec33c52058..d82d1e5d51 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts @@ -3,12 +3,15 @@ import { UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_CONTEXT, UmbDocumentRecycleBinTreeStore, } from './document-recycle.bin.tree.store.js'; -import type { UmbTreeDataSource, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { UmbBaseController, type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { DocumentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export class UmbDocumentRecycleBinRepository extends UmbBaseController implements UmbTreeRepository { +export class UmbDocumentRecycleBinRepository + extends UmbBaseController + implements UmbTreeRepository +{ #init!: Promise; #treeSource: UmbTreeDataSource; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle.bin.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle.bin.tree.store.ts index fa3f3290c3..423a4ad9b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle.bin.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle.bin.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/sources/document-recycle-bin.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/sources/document-recycle-bin.tree.server.data.ts index 5ece92631e..135fb1fb8d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/sources/document-recycle-bin.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/sources/document-recycle-bin.tree.server.data.ts @@ -1,6 +1,6 @@ -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { type UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { DocumentResource } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.repository.ts index 93ed673c97..347534d417 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.repository.ts @@ -4,7 +4,8 @@ import { UmbDocumentTreeStore, UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN } from './d import { UmbDocumentTreeServerDataSource } from './sources/document.tree.server.data.js'; import { UMB_DOCUMENT_ITEM_STORE_CONTEXT_TOKEN, type UmbDocumentItemStore } from './document-item.store.js'; import { UmbDocumentItemServerDataSource } from './sources/document-item.server.data.js'; -import type { UmbTreeDataSource, UmbTreeRepository, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { DocumentResponseModel, @@ -15,7 +16,8 @@ import { import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbDocumentRepository extends UmbBaseController +export class UmbDocumentRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.tree.store.ts index f24842be6a..b832f650fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/sources/document.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/sources/document.tree.server.data.ts index 52451141b9..838c5e149f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/sources/document.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/sources/document.tree.server.data.ts @@ -1,6 +1,6 @@ -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { type UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { DocumentResource } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -23,7 +23,7 @@ export class UmbDocumentTreeServerDataSource implements UmbTreeDataSource { headers: { 'Content-Type': 'application/json', }, - }) + }), ); } @@ -37,7 +37,7 @@ export class UmbDocumentTreeServerDataSource implements UmbTreeDataSource { headers: { 'Content-Type': 'application/json', }, - }) + }), ); } @@ -77,7 +77,7 @@ export class UmbDocumentTreeServerDataSource implements UmbTreeDataSource { this.#host, DocumentResource.getTreeDocumentChildren({ parentId, - }) + }), ); } } @@ -97,7 +97,7 @@ export class UmbDocumentTreeServerDataSource implements UmbTreeDataSource { this.#host, DocumentResource.getDocumentItem({ id: ids, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index ab2de1d00f..f7afd41e5f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbDocumentRepository } from '../repository/document.repository.js'; -import { UmbDocumentTypeRepository } from '../../document-types/repository/document-type.repository.js'; +import { UmbDocumentTypeDetailRepository } from '../../document-types/repository/detail/document-type-detail.repository.js'; import { UmbDocumentVariantContext } from '../variant-context/document-variant-context.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; @@ -54,7 +54,10 @@ export class UmbDocumentWorkspaceContext // TODO: Get Workspace Alias via Manifest. super(host, 'Umb.Workspace.Document', new UmbDocumentRepository(host)); - this.structure = new UmbContentTypePropertyStructureManager(this.host, new UmbDocumentTypeRepository(this.host)); + this.structure = new UmbContentTypePropertyStructureManager( + this.host, + new UmbDocumentTypeDetailRepository(this.host), + ); this.splitView = new UmbWorkspaceSplitViewManager(this.host); new UmbObserverController(this.host, this.documentTypeKey, (id) => this.structure.loadType(id)); @@ -130,7 +133,7 @@ export class UmbDocumentWorkspaceContext const variants = partialUpdateFrozenArray( oldVariants, { name }, - variantId ? (x) => variantId.compare(x) : () => true + variantId ? (x) => variantId.compare(x) : () => true, ); this.#currentData.update({ variants }); } @@ -142,7 +145,8 @@ export class UmbDocumentWorkspaceContext async propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId) { return this.#currentData.asObservablePart( (data) => - data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))?.value as PropertyValueType + data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true)) + ?.value as PropertyValueType, ); } @@ -156,20 +160,24 @@ export class UmbDocumentWorkspaceContext const currentData = this.#currentData.value; if (currentData) { const newDataSet = currentData.values?.find( - (x) => x.alias === alias && (variantId ? variantId.compare(x) : true) + (x) => x.alias === alias && (variantId ? variantId.compare(x) : true), ); return newDataSet?.value as ReturnType; } return undefined; } - async setPropertyValue(alias: string, value: PropertyValueType, variantId?: UmbVariantId) { + async setPropertyValue( + alias: string, + value: PropertyValueType, + variantId?: UmbVariantId, + ) { const entry = { ...variantId?.toObject(), alias, value }; const currentData = this.#currentData.value; if (currentData) { const values = appendToFrozenArray( currentData.values || [], entry, - (x) => x.alias === alias && (variantId ? variantId.compare(x) : true) + (x) => x.alias === alias && (variantId ? variantId.compare(x) : true), ); this.#currentData.update({ values }); } @@ -221,9 +229,11 @@ export class UmbDocumentWorkspaceContext export default UmbDocumentWorkspaceContext; - -export const UMB_DOCUMENT_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DOCUMENT_WORKSPACE_CONTEXT = new UmbContextToken< + UmbSaveableWorkspaceContextInterface, + UmbDocumentWorkspaceContext +>( 'UmbWorkspaceContext', // TODO: Refactor: make a better generic way to identify workspaces, maybe workspaceType or workspaceAlias?. - (context): context is UmbDocumentWorkspaceContext => context.getEntityType?.() === 'document' + (context): context is UmbDocumentWorkspaceContext => context.getEntityType?.() === 'document', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.repository.ts index 0bd3481691..dea0b3010e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.repository.ts @@ -7,13 +7,12 @@ import { UmbMediaTypeItemServerDataSource } from './sources/media-type-item.serv import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { - UmbTreeRepository, - UmbTreeDataSource, UmbDataSource, UmbItemRepository, UmbDetailRepository, UmbItemDataSource, } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { CreateMediaTypeRequestModel, FolderTreeItemResponseModel, @@ -23,7 +22,8 @@ import { } from '@umbraco-cms/backoffice/backend-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbMediaTypeRepository extends UmbBaseController +export class UmbMediaTypeRepository + extends UmbBaseController implements UmbItemRepository, UmbTreeRepository, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.tree.store.ts index 6556470752..b5b1bbf4e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/media-type.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; /** @@ -20,5 +20,5 @@ export class UmbMediaTypeTreeStore extends UmbEntityTreeStore { } export const UMB_MEDIA_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbMediaTypeTreeStore' + 'UmbMediaTypeTreeStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/sources/media-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/sources/media-type.tree.server.data.ts index 4a89b13267..db42fb34d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/sources/media-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/sources/media-type.tree.server.data.ts @@ -1,6 +1,6 @@ import { MediaTypeResource } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -48,7 +48,7 @@ export class UmbMediaTypeTreeServerDataSource implements UmbTreeDataSource { this.#host, MediaTypeResource.getTreeMediaTypeChildren({ parentId, - }) + }), ); } } @@ -68,7 +68,7 @@ export class UmbMediaTypeTreeServerDataSource implements UmbTreeDataSource { this.#host, MediaTypeResource.getMediaTypeItem({ id: ids, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/media.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/media.repository.ts index 714da6a421..740b55dcd1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/media.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/media.repository.ts @@ -5,7 +5,7 @@ import { UmbMediaStore, UMB_MEDIA_STORE_CONTEXT_TOKEN } from './media.store.js'; import { UmbMediaDetailServerDataSource } from './sources/media.detail.server.data.js'; import { UmbMediaItemServerDataSource } from './sources/media-item.server.data.js'; import { UmbMediaItemStore } from './media-item.store.js'; -import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { CreateMediaRequestModel, @@ -16,7 +16,8 @@ import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbMediaRepository extends UmbBaseController +export class UmbMediaRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/media.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/media.tree.store.ts index 5924ae211b..eb8fcb20e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/media.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/media.tree.store.ts @@ -1,7 +1,7 @@ import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export const UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMediaTreeStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/sources/media.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/sources/media.tree.server.data.ts index 7dfcecd390..c1f10a516a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/sources/media.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/sources/media.tree.server.data.ts @@ -1,6 +1,6 @@ -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { type UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { MediaResource } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -23,7 +23,7 @@ export class UmbMediaTreeServerDataSource implements UmbTreeDataSource { headers: { 'Content-Type': 'application/json', }, - }) + }), ); } @@ -37,7 +37,7 @@ export class UmbMediaTreeServerDataSource implements UmbTreeDataSource { headers: { 'Content-Type': 'application/json', }, - }) + }), ); } @@ -77,7 +77,7 @@ export class UmbMediaTreeServerDataSource implements UmbTreeDataSource { this.#host, MediaResource.getTreeMediaChildren({ parentId, - }) + }), ); } } @@ -97,7 +97,7 @@ export class UmbMediaTreeServerDataSource implements UmbTreeDataSource { this.#host, MediaResource.getTreeMediaItem({ id: ids, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/member-group.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/member-group.repository.ts index d1c12dc190..7ad5df7036 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/member-group.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/member-group.repository.ts @@ -5,12 +5,14 @@ import { UmbMemberGroupStore, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN } from './mem import { UmbMemberGroupTreeServerDataSource } from './sources/member-group.tree.server.data.js'; import { UmbBaseController, type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; -import type { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; // TODO => Update type when backend updated -export class UmbMemberGroupRepository extends UmbBaseController +export class UmbMemberGroupRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository, UmbApi { #init!: Promise; @@ -24,7 +26,7 @@ export class UmbMemberGroupRepository extends UmbBaseController #notificationContext?: UmbNotificationContext; constructor(host: UmbControllerHost) { - super(host) + super(host); // TODO: figure out how spin up get the correct data source this.#treeSource = new UmbMemberGroupTreeServerDataSource(this); this.#detailSource = new UmbMemberGroupDetailServerDataSource(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/member-group.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/member-group.tree.store.ts index f2946c0a9f..52ad906621 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/member-group.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/member-group.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; /** @@ -20,5 +20,5 @@ export class UmbMemberGroupTreeStore extends UmbEntityTreeStore { } export const UMB_MEMBER_GROUP_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbMemberGroupTreeStore' + 'UmbMemberGroupTreeStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/sources/member-group.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/sources/member-group.tree.server.data.ts index 29e9822476..f976405daa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/sources/member-group.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/repository/sources/member-group.tree.server.data.ts @@ -1,6 +1,6 @@ import { MemberGroupResource } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { type UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -56,7 +56,7 @@ export class UmbMemberGroupTreeServerDataSource implements UmbTreeDataSource { this.#host, MemberGroupResource.getMemberGroupItem({ id: ids, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/member-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/member-type.repository.ts index e231a3886e..e1f027301c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/member-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/member-type.repository.ts @@ -4,7 +4,8 @@ import { UmbMemberTypeTreeStore, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN } from import { UmbMemberTypeStore, UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN } from './member-type.store.js'; import { UmbMemberTypeDetailServerDataSource } from './sources/member-type.detail.server.data.js'; import { UmbBaseController, type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -12,7 +13,10 @@ import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api type ItemType = any; type TreeItemType = EntityTreeItemResponseModel; -export class UmbMemberTypeRepository extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository { +export class UmbMemberTypeRepository + extends UmbBaseController + implements UmbTreeRepository, UmbDetailRepository +{ #init!: Promise; #treeSource: UmbTreeDataSource; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/member-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/member-type.tree.store.ts index 06c9d08f33..3d7289a967 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/member-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/member-type.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; /** @@ -15,5 +15,5 @@ export class UmbMemberTypeTreeStore extends UmbEntityTreeStore { } export const UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbMemberTypeTreeStore' + 'UmbMemberTypeTreeStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/sources/member-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/sources/member-type.tree.server.data.ts index c537bde7b0..dc58111dc4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/sources/member-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/sources/member-type.tree.server.data.ts @@ -1,6 +1,6 @@ import { ApiError, MemberTypeResource } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { type UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -56,7 +56,7 @@ export class UmbMemberTypeTreeServerDataSource implements UmbTreeDataSource { this.#host, MemberTypeResource.getMemberTypeItem({ id: ids, - }) + }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.repository.ts index f807fa0d5b..80afb72da6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.repository.ts @@ -1,7 +1,7 @@ import { UmbMemberTreeStore, UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN } from './member.tree.store.js'; import { UmbMemberTreeServerDataSource } from './sources/member.tree.server.data.js'; import { UmbBaseController, type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; +import { type UmbTreeRepository } from '@umbraco-cms/backoffice/tree'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export class UmbMemberRepository extends UmbBaseController implements UmbTreeRepository, UmbApi { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.tree.store.ts index 7cf9d39911..647747ea5d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/repository/member.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export const UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberTreeStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts index 7ae1642427..482a5f8154 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts @@ -9,11 +9,13 @@ import { RelationTypeResponseModel, UpdateRelationTypeRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRepository } from '@umbraco-cms/backoffice/tree'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbRelationTypeRepository extends UmbBaseController +export class UmbRelationTypeRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository, diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.tree.store.ts index b5f8f68ce3..fd796dd6e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; /** * @export @@ -21,5 +21,5 @@ export class UmbRelationTypeTreeStore extends UmbEntityTreeStore { } export const UMB_RELATION_TYPE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbRelationTypeTreeStore' + 'UmbRelationTypeTreeStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-views.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-views.repository.ts index 50486ef4ae..a5ba02665f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-views.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-views.repository.ts @@ -26,11 +26,12 @@ import { UmbDataSourceErrorResponse, UmbDetailRepository, UmbFolderRepository, - UmbTreeRepository, } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRepository } from '@umbraco-cms/backoffice/tree'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbPartialViewsRepository extends UmbBaseController +export class UmbPartialViewsRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository< @@ -65,7 +66,7 @@ export class UmbPartialViewsRepository extends UmbBaseController //#region FOLDER createFolderScaffold( - parentId: string | null + parentId: string | null, ): Promise<{ data?: FolderResponseModel | undefined; error?: ProblemDetails | undefined }> { const data: FolderResponseModel = { name: '', @@ -74,7 +75,7 @@ export class UmbPartialViewsRepository extends UmbBaseController return Promise.resolve({ data, error: undefined }); } async createFolder( - requestBody: CreateFolderRequestModel + requestBody: CreateFolderRequestModel, ): Promise<{ data?: string | undefined; error?: ProblemDetails | undefined }> { await this.#init; const req = { @@ -87,14 +88,14 @@ export class UmbPartialViewsRepository extends UmbBaseController return promise; } async requestFolder( - unique: string + unique: string, ): Promise<{ data?: PartialViewGetFolderResponse | undefined; error?: ProblemDetails | undefined }> { await this.#init; return this.#folderDataSource.get(unique); } updateFolder( unique: string, - folder: FolderModelBaseModel + folder: FolderModelBaseModel, ): Promise<{ data?: FolderModelBaseModel | undefined; error?: ProblemDetails | undefined }> { throw new Error('Method not implemented.'); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-views.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-views.tree.store.ts index 4f8f98e127..6859abd681 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-views.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-views.tree.store.ts @@ -1,10 +1,10 @@ import { UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT_TOKEN_ALIAS } from '../config.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbFileSystemTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbFileSystemTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export const UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( - UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT_TOKEN_ALIAS + UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT_TOKEN_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 4648ae06e4..0d5cc03732 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 @@ -8,8 +8,8 @@ import { UmbDataSourceErrorResponse, UmbDetailRepository, UmbFolderRepository, - UmbTreeRepository, } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRepository } from '@umbraco-cms/backoffice/tree'; import { CreateFolderRequestModel, CreateScriptRequestModel, @@ -26,7 +26,8 @@ import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/co import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbScriptsRepository extends UmbBaseController +export class UmbScriptsRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository, 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 3dd1fe2461..9aecaf00aa 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 @@ -1,6 +1,6 @@ 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 { UmbFileSystemTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( @@ -11,7 +11,7 @@ export const UMB_SCRIPTS_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken }> e } async execute() { + if (this.unique !== null) { + // Note: %2F is a slash (/) + this.unique = this.unique.replace(/\//g, '%2F'); + } + history.pushState( null, '', diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts index b5b4e71368..a8ed2d1327 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/create.action.ts @@ -7,6 +7,11 @@ export class UmbCreateStylesheetAction }> exte } async execute() { + if (this.unique !== null) { + // Note: %2F is a slash (/) + this.unique = this.unique.replace(/\//g, '%2F'); + } + history.pushState(null, '', `section/settings/workspace/stylesheet/create/${this.unique ?? 'null'}/view/code`); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts index d21cd9a82b..4c1da9ff30 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/manifests.ts @@ -1,10 +1,11 @@ import { - STYLESHEET_ENTITY_TYPE, - STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, - STYLESHEET_FOLDER_ENTITY_TYPE, - STYLESHEET_REPOSITORY_ALIAS, - STYLESHEET_ROOT_ENTITY_TYPE, -} from '../config.js'; + UMB_STYLESHEET_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_ENTITY_TYPE, + UMB_STYLESHEET_ROOT_ENTITY_TYPE, +} from '../entity-type.js'; + +import { UMB_STYLESHEET_REPOSITORY_ALIAS } from '../repository/index.js'; import { UmbCreateRTFStylesheetAction } from './create/create-rtf.action.js'; import { UmbCreateStylesheetAction } from './create/create.action.js'; import { @@ -26,8 +27,8 @@ const stylesheetActions: Array = [ meta: { icon: 'icon-trash', label: 'Delete', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [UMB_STYLESHEET_ENTITY_TYPE], }, }, ]; @@ -43,8 +44,12 @@ const stylesheetFolderActions: Array = [ meta: { icon: 'icon-script', label: 'New stylesheet file', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_FOLDER_ENTITY_TYPE, STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, STYLESHEET_ROOT_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [ + UMB_STYLESHEET_FOLDER_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, + UMB_STYLESHEET_ROOT_ENTITY_TYPE, + ], }, }, { @@ -55,8 +60,12 @@ const stylesheetFolderActions: Array = [ meta: { icon: 'icon-script', label: 'New Rich Text Editor style sheet file', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_FOLDER_ENTITY_TYPE, STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, STYLESHEET_ROOT_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [ + UMB_STYLESHEET_FOLDER_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, + UMB_STYLESHEET_ROOT_ENTITY_TYPE, + ], }, }, { @@ -67,8 +76,8 @@ const stylesheetFolderActions: Array = [ meta: { icon: 'icon-trash', label: 'Remove folder', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE], }, }, { @@ -79,8 +88,12 @@ const stylesheetFolderActions: Array = [ meta: { icon: 'icon-add', label: 'Create folder', - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, - entityTypes: [STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, STYLESHEET_FOLDER_ENTITY_TYPE, STYLESHEET_ROOT_ENTITY_TYPE], + repositoryAlias: UMB_STYLESHEET_REPOSITORY_ALIAS, + entityTypes: [ + UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE, + UMB_STYLESHEET_FOLDER_ENTITY_TYPE, + UMB_STYLESHEET_ROOT_ENTITY_TYPE, + ], }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-type.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-type.ts new file mode 100644 index 0000000000..8dbd996a3e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-type.ts @@ -0,0 +1,5 @@ +export const UMB_STYLESHEET_ENTITY_TYPE = 'stylesheet'; +export const UMB_STYLESHEET_ROOT_ENTITY_TYPE = 'stylesheet-root'; + +export const UMB_STYLESHEET_FOLDER_ENTITY_TYPE = 'stylesheet-folder'; +export const UMB_STYLESHEET_FOLDER_EMPTY_ENTITY_TYPE = 'stylesheet-folder-empty'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts index ec91672f86..c0657c8bf8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/index.ts @@ -3,3 +3,4 @@ import { StylesheetResponseModel } from '@umbraco-cms/backoffice/backend-api'; export type StylesheetDetails = StylesheetResponseModel; export * from './repository/index.js'; +export { UmbStylesheetTreeRepository } from './tree/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/menu-item/manifests.ts index 287fa5a01b..4109f5071c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/menu-item/manifests.ts @@ -1,4 +1,4 @@ -import { STYLESHEET_TREE_ALIAS } from '../tree/manifests.js'; +import { UMB_STYLESHEET_TREE_ALIAS } from '../tree/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestTypes = { @@ -10,7 +10,7 @@ const menuItem: ManifestTypes = { meta: { label: 'Stylesheets', icon: 'icon-folder', - treeAlias: STYLESHEET_TREE_ALIAS, + treeAlias: UMB_STYLESHEET_TREE_ALIAS, menus: ['Umb.Menu.Templating'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts index c95f93399b..3ee1d14e58 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/index.ts @@ -1 +1,3 @@ export * from './stylesheet.repository.js'; +export * from './item/index.js'; +export { UMB_STYLESHEET_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/index.ts new file mode 100644 index 0000000000..929e43c0f8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/index.ts @@ -0,0 +1,3 @@ +export { UmbStylesheetItemRepository } from './stylesheet-item.repository.js'; +export { UMB_STYLESHEET_ITEM_REPOSITORY_ALIAS, UMB_STYLESHEET_ITEM_STORE_ALIAS } from './manifests.js'; +export { UMB_STYLESHEET_ITEM_STORE_CONTEXT } from './stylesheet-item.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts new file mode 100644 index 0000000000..97aaa9753e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/manifests.ts @@ -0,0 +1,22 @@ +import { UmbStylesheetItemStore } from './stylesheet-item.store.js'; +import { UmbStylesheetItemRepository } from './stylesheet-item.repository.js'; +import type { ManifestRepository, ManifestItemStore } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_STYLESHEET_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet.Item'; +export const UMB_STYLESHEET_ITEM_STORE_ALIAS = 'Umb.ItemStore.Stylesheet'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_STYLESHEET_ITEM_REPOSITORY_ALIAS, + name: 'Stylesheet Item Repository', + api: UmbStylesheetItemRepository, +}; + +const itemStore: ManifestItemStore = { + type: 'itemStore', + alias: 'Umb.ItemStore.Stylesheet', + name: 'Stylesheet Item Store', + api: UmbStylesheetItemStore, +}; + +export const manifests = [repository, itemStore]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts new file mode 100644 index 0000000000..9cc0cc8198 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.repository.ts @@ -0,0 +1,11 @@ +import { UmbStylesheetItemServerDataSource } from './stylesheet-item.server.data-source.js'; +import { UMB_STYLESHEET_ITEM_STORE_CONTEXT } from './stylesheet-item.store.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { StylesheetItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbStylesheetItemRepository extends UmbItemRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbStylesheetItemServerDataSource, UMB_STYLESHEET_ITEM_STORE_CONTEXT); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts new file mode 100644 index 0000000000..2c65c2a56c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts @@ -0,0 +1,40 @@ +import type { UmbItemDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { StylesheetItemResponseModel, StylesheetResource } from '@umbraco-cms/backoffice/backend-api'; + +/** + * A data source for stylesheet items that fetches data from the server + * @export + * @class UmbStylesheetItemServerDataSource + * @implements {UmbItemDataSource} + */ +export class UmbStylesheetItemServerDataSource implements UmbItemDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbStylesheetItemServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbStylesheetItemServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches the items for the given paths from the server + * @param {Array} paths + * @return {*} + * @memberof UmbStylesheetItemServerDataSource + */ + async getItems(paths: Array) { + if (!paths) throw new Error('Paths are missing'); + + return tryExecuteAndNotify( + this.#host, + StylesheetResource.getStylesheetItem({ + path: paths, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts new file mode 100644 index 0000000000..661cc27988 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.store.ts @@ -0,0 +1,24 @@ +import type { StylesheetItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbFileSystemItemStore } from '@umbraco-cms/backoffice/store'; + +/** + * @export + * @class UmbStylesheetItemStore + * @extends {UmbFileSystemItemStore} + * @description - Data Store for Stylesheet items + */ + +export class UmbStylesheetItemStore extends UmbFileSystemItemStore { + /** + * Creates an instance of UmbStylesheetItemStore. + * @param {UmbControllerHostElement} host + * @memberof UmbStylesheetItemStore + */ + constructor(host: UmbControllerHostElement) { + super(host, UMB_STYLESHEET_ITEM_STORE_CONTEXT.toString()); + } +} + +export const UMB_STYLESHEET_ITEM_STORE_CONTEXT = new UmbContextToken('UmbStylesheetItemStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts index e1ace39c01..184a4de42b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/manifests.ts @@ -1,22 +1,14 @@ -import { STYLESHEET_REPOSITORY_ALIAS, STYLESHEET_TREE_STORE_ALIAS } from '../config.js'; import { UmbStylesheetRepository } from './stylesheet.repository.js'; -import { UmbStylesheetTreeStore } from './stylesheet.tree.store.js'; -import { ManifestRepository, ManifestTreeStore } from '@umbraco-cms/backoffice/extension-registry'; +import { manifests as itemManifests } from './item/manifests.js'; +import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; +export const UMB_STYLESHEET_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet'; const repository: ManifestRepository = { type: 'repository', - alias: STYLESHEET_REPOSITORY_ALIAS, + alias: UMB_STYLESHEET_REPOSITORY_ALIAS, name: 'Stylesheet Repository', api: UmbStylesheetRepository, }; - -const treeStore: ManifestTreeStore = { - type: 'treeStore', - alias: STYLESHEET_TREE_STORE_ALIAS, - name: 'Stylesheet Tree Store', - api: UmbStylesheetTreeStore, -}; - -export const manifests = [treeStore, repository]; +export const manifests = [repository, ...itemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts index a0c62959b3..9c5ec4ee0b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/stylesheet.repository.ts @@ -1,6 +1,4 @@ import { StylesheetDetails } from '../index.js'; -import { UmbStylesheetTreeStore, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN } from './stylesheet.tree.store.js'; -import { UmbStylesheetTreeServerDataSource } from './sources/stylesheet.tree.server.data.js'; import { UmbStylesheetServerDataSource } from './sources/stylesheet.server.data.js'; import { StylesheetGetFolderResponse, @@ -13,8 +11,8 @@ import { UmbDataSourceErrorResponse, UmbDetailRepository, UmbFolderRepository, - UmbTreeRepository, } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRepository } from '@umbraco-cms/backoffice/tree'; import { CreateFolderRequestModel, CreateStylesheetRequestModel, @@ -33,33 +31,24 @@ import { UpdateStylesheetRequestModel, UpdateTextFileViewModelBaseModel, } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/tree'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbStylesheetRepository extends UmbBaseController +export class UmbStylesheetRepository + extends UmbBaseController implements - UmbTreeRepository, UmbDetailRepository, UmbFolderRepository, UmbApi { #dataSource; - #treeDataSource; - #treeStore?: UmbStylesheetTreeStore; #folderDataSource; - #init; constructor(host: UmbControllerHostElement) { super(host); // TODO: figure out how spin up get the correct data source this.#dataSource = new UmbStylesheetServerDataSource(this); - this.#treeDataSource = new UmbStylesheetTreeServerDataSource(this); this.#folderDataSource = new UmbStylesheetFolderServerDataSource(this); - - this.#init = this.consumeContext(UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN, (instance) => { - this.#treeStore = instance; - }).asPromise(); } //#region FOLDER: @@ -77,34 +66,34 @@ export class UmbStylesheetRepository extends UmbBaseController async createFolder( folderRequest: CreateFolderRequestModel, ): Promise<{ data?: string | undefined; error?: ProblemDetails | undefined }> { - await this.#init; const req = { parentPath: folderRequest.parentId, name: folderRequest.name, }; const promise = this.#folderDataSource.insert(req); await promise; - this.requestTreeItemsOf(folderRequest.parentId ? folderRequest.parentId : null); + //this.requestTreeItemsOf(folderRequest.parentId ? folderRequest.parentId : null); return promise; } + async requestFolder( unique: string, ): Promise<{ data?: StylesheetGetFolderResponse | undefined; error?: ProblemDetails | undefined }> { - await this.#init; return this.#folderDataSource.get(unique); } + updateFolder( unique: string, folder: FolderModelBaseModel, ): Promise<{ data?: FolderModelBaseModel | undefined; error?: ProblemDetails | undefined }> { throw new Error('Method not implemented.'); } + async deleteFolder(path: string): Promise<{ error?: ProblemDetails | undefined }> { - await this.#init; const { data } = await this.requestFolder(path); const promise = this.#folderDataSource.delete(path); await promise; - this.requestTreeItemsOf(data?.parentPath ? data?.parentPath : null); + //this.requestTreeItemsOf(data?.parentPath ? data?.parentPath : null); return promise; } @@ -121,26 +110,29 @@ export class UmbStylesheetRepository extends UmbBaseController async requestById(id: string): Promise> { if (!id) throw new Error('id is missing'); - await this.#init; const { data, error } = await this.#dataSource.get(id); return { data, error }; } + byId(id: string): Promise> { throw new Error('Method not implemented.'); } + async create(data: CreateTextFileViewModelBaseModel): Promise> { const promise = this.#dataSource.insert(data); await promise; - this.requestTreeItemsOf(data.parentPath ? data.parentPath : null); + //this.requestTreeItemsOf(data.parentPath ? data.parentPath : null); return promise; } + save(id: string, data: UpdateTextFileViewModelBaseModel): Promise { return this.#dataSource.update(id, data); } + delete(id: string): Promise { const promise = this.#dataSource.delete(id); const parentPath = id.substring(0, id.lastIndexOf('/')); - this.requestTreeItemsOf(parentPath ? parentPath : null); + //this.requestTreeItemsOf(parentPath ? parentPath : null); return promise; } @@ -179,71 +171,4 @@ export class UmbStylesheetRepository extends UmbBaseController } //#endregion - - //#region TREE: - async requestTreeRoot() { - await this.#init; - - const data = { - path: null, - type: 'stylesheet-root', - name: 'Stylesheets', - icon: 'icon-folder', - hasChildren: true, - }; - - return { data }; - } - - async requestRootTreeItems() { - await this.#init; - - const { data, error } = await this.#treeDataSource.getRootItems(); - - if (data) { - this.#treeStore?.appendItems(data.items); - } - - return { data, error }; - } - - async requestTreeItemsOf(path: string | null) { - if (path === undefined) throw new Error('Cannot request tree item with missing path'); - - await this.#init; - - const { data, error } = await this.#treeDataSource.getChildrenOf(path); - - if (data) { - this.#treeStore!.appendItems(data.items); - } - - return { data, error, asObservable: () => this.#treeStore!.childrenOf(path) }; - } - - async requestItems(paths: Array) { - if (!paths) throw new Error('Paths are missing'); - await this.#init; - const { data, error } = await this.#treeDataSource.getItems(paths); - return { data, error }; - } - - async rootTreeItems() { - await this.#init; - return this.#treeStore!.rootItems; - } - - async treeItemsOf(parentPath: string | null) { - if (!parentPath) throw new Error('Parent Path is missing'); - await this.#init; - return this.#treeStore!.childrenOf(parentPath); - } - - async itemsLegacy(paths: Array) { - if (!paths) throw new Error('Paths are missing'); - await this.#init; - return this.#treeStore!.items(paths); - } - - //#endregion } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/index.ts new file mode 100644 index 0000000000..de16c2e3c3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/index.ts @@ -0,0 +1 @@ +export { UmbStylesheetTreeRepository } from './stylesheet-tree.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts index 108889cea8..1ee6d92c47 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts @@ -1,15 +1,38 @@ -import { STYLESHEET_ENTITY_TYPE, STYLESHEET_REPOSITORY_ALIAS } from '../config.js'; -import type { ManifestTree, ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_STYLESHEET_ENTITY_TYPE } from '../entity-type.js'; +import { UmbStylesheetTreeRepository } from './stylesheet-tree.repository.js'; +import { UmbStylesheetTreeStore } from './stylesheet-tree.store.js'; +import type { + ManifestRepository, + ManifestTree, + ManifestTreeItem, + ManifestTreeStore, +} from '@umbraco-cms/backoffice/extension-registry'; -export const STYLESHEET_TREE_ALIAS = 'Umb.Tree.Stylesheet'; +export const UMB_STYLESHEET_TREE_ALIAS = 'Umb.Tree.Stylesheet'; +export const UMB_STYLESHEET_TREE_REPOSITORY_ALIAS = 'Umb.Repository.StylesheetTree'; +export const UMB_STYLESHEET_TREE_STORE_ALIAS = 'Umb.Store.StylesheetTree'; + +const treeRepository: ManifestRepository = { + type: 'repository', + alias: UMB_STYLESHEET_TREE_REPOSITORY_ALIAS, + name: 'Stylesheet Tree Repository', + api: UmbStylesheetTreeRepository, +}; + +const treeStore: ManifestTreeStore = { + type: 'treeStore', + alias: UMB_STYLESHEET_TREE_STORE_ALIAS, + name: 'Stylesheet Tree Store', + api: UmbStylesheetTreeStore, +}; const tree: ManifestTree = { type: 'tree', - alias: STYLESHEET_TREE_ALIAS, + alias: UMB_STYLESHEET_TREE_ALIAS, name: 'Stylesheet Tree', weight: 10, meta: { - repositoryAlias: STYLESHEET_REPOSITORY_ALIAS, + repositoryAlias: UMB_STYLESHEET_TREE_REPOSITORY_ALIAS, }, }; @@ -19,8 +42,8 @@ const treeItem: ManifestTreeItem = { alias: 'Umb.TreeItem.Stylesheet', name: 'Stylesheet Tree Item', meta: { - entityTypes: ['stylesheet-root', STYLESHEET_ENTITY_TYPE], + entityTypes: ['stylesheet-root', UMB_STYLESHEET_ENTITY_TYPE], }, }; -export const manifests = [tree, treeItem]; +export const manifests = [treeRepository, treeStore, tree, treeItem]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts new file mode 100644 index 0000000000..d080059d08 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.repository.ts @@ -0,0 +1,22 @@ +import { UmbStylesheetTreeServerDataSource } from './stylesheet-tree.server.data-source.js'; +import { UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN } from './stylesheet-tree.store.js'; +import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbStylesheetTreeRepository extends UmbTreeRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbStylesheetTreeServerDataSource, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN); + } + + async requestTreeRoot() { + const data = { + path: null, + type: 'stylesheet-root', + name: 'Stylesheets', + icon: 'icon-folder', + hasChildren: true, + }; + + return { data }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts similarity index 95% rename from src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts index 7c846f3898..7b8c3f199f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts @@ -1,7 +1,7 @@ import { FileSystemTreeItemPresentationModel, StylesheetResource } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; /** * A data source for the Stylesheet tree that fetches data from the server @@ -48,7 +48,7 @@ export class UmbStylesheetTreeServerDataSource implements UmbTreeDataSource( - 'UmbStylesheetTreeStore' + 'UmbStylesheetTreeStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts index d37300a880..2028478b43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace-editor.element.ts @@ -48,7 +48,11 @@ export class UmbStylesheetWorkspaceEditorElement extends UmbLitElement { this.#workspaceContext.path, (path) => { this._path = path; - this._dirName = this._path?.substring(0, this._path?.lastIndexOf('\\') + 1)?.replace(/\\/g, '/'); + if (this._path?.includes('.css')) { + this._dirName = this._path?.substring(0, this._path?.lastIndexOf('\\') + 1)?.replace(/\\/g, '/'); + } else { + this._dirName = path + '/'; + } }, '_observeStylesheetPath', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index b6ab5c12d3..1ee3e2e599 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -2,11 +2,7 @@ import { UmbStylesheetRepository } from '../repository/stylesheet.repository.js' import { StylesheetDetails } from '../index.js'; import { UmbSaveableWorkspaceContextInterface, UmbEditableWorkspaceContextBase } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { - UmbArrayState, - UmbBooleanState, - UmbObjectState -} from '@umbraco-cms/backoffice/observable-api'; +import { UmbArrayState, UmbBooleanState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { RichTextRuleModel, UpdateStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -48,10 +44,10 @@ export class UmbStylesheetWorkspaceContext } getEntityId() { - const path = this.getData()?.path; + const path = this.getData()?.path?.replace(/\//g, '%2F'); const name = this.getData()?.name; - // TODO: %2F is a slash (/). Should we make it an actual slash in the URL? (%2F for now so that the server can find the correct stylesheet via URL) + // Note: %2F is a slash (/) return path && name ? `${path}%2F${name}` : name || ''; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts index 76485ab439..c4f74d092e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.element.ts @@ -19,6 +19,7 @@ export class UmbStylesheetWorkspaceElement extends UmbLitElement { const path = info.match.params.path === 'null' ? null : info.match.params.path; const serverPath = path === null ? null : serverFilePathFromUrlFriendlyPath(path); await this.#workspaceContext.create(serverPath); + await this.#workspaceContext.setRules([]); new UmbWorkspaceIsNewRedirectController( this, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template.repository.ts index 74ccde7cea..889783daf4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template.repository.ts @@ -6,13 +6,8 @@ import { UMB_TEMPLATE_ITEM_STORE_CONTEXT_TOKEN, UmbTemplateItemStore } from './t import { UmbTemplateItemServerDataSource } from './sources/template.item.server.data.js'; import { UmbTemplateQueryBuilderServerDataSource } from './sources/template.query-builder.server.data.js'; import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import type { - UmbDetailRepository, - UmbItemDataSource, - UmbItemRepository, - UmbTreeDataSource, - UmbTreeRepository, -} from '@umbraco-cms/backoffice/repository'; +import type { UmbDetailRepository, UmbItemDataSource, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/tree'; import { UmbBaseController, type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import type { @@ -26,7 +21,8 @@ import type { } from '@umbraco-cms/backoffice/backend-api'; import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbTemplateRepository extends UmbBaseController +export class UmbTemplateRepository + extends UmbBaseController implements UmbTreeRepository, UmbDetailRepository, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template.tree.store.ts index 635ae820d0..b4effc9fa6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; +import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export const UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbTemplateTreeStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts index 2a9cf401ff..b5f5fe9eda 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts @@ -47,8 +47,12 @@ export class UmbCurrentUserHeaderAppElement extends UmbLitElement { render() { return html` - - + + `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.context.ts index 41810a95c0..6bdbf6f7bd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.context.ts @@ -1,3 +1,4 @@ +import { UMB_USER_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UmbPickerInputContext } from '@umbraco-cms/backoffice/picker-input'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UMB_USER_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; @@ -5,6 +6,6 @@ import { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbUserPickerContext extends UmbPickerInputContext { constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Repository.User', UMB_USER_PICKER_MODAL); + super(host, UMB_USER_ITEM_REPOSITORY_ALIAS, UMB_USER_PICKER_MODAL); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/index.ts index 0acac90279..cd83556a1d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/index.ts @@ -4,3 +4,4 @@ export * from './enable/enable-user.repository.js'; export * from './unlock/unlock-user.repository.js'; export * from './invite/invite-user.repository.js'; export * from './user.repository.js'; +export * from './item/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/index.ts new file mode 100644 index 0000000000..77cd20f1fb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/index.ts @@ -0,0 +1,3 @@ +export { UmbUserItemRepository } from './user-item.repository.js'; +export { UMB_USER_ITEM_STORE_CONTEXT } from './user-item.store.js'; +export { UMB_USER_ITEM_REPOSITORY_ALIAS, UMB_USER_ITEM_STORE_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/manifests.ts new file mode 100644 index 0000000000..2bdc867ee6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/manifests.ts @@ -0,0 +1,22 @@ +import { UmbUserItemStore } from './user-item.store.js'; +import { UmbUserItemRepository } from './user-item.repository.js'; +import { ManifestItemStore, ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_USER_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.User.Item'; +export const UMB_USER_ITEM_STORE_ALIAS = 'Umb.ItemStore.User'; + +const itemRepository: ManifestRepository = { + type: 'repository', + alias: UMB_USER_ITEM_REPOSITORY_ALIAS, + name: 'User Item Repository', + api: UmbUserItemRepository, +}; + +const itemStore: ManifestItemStore = { + type: 'itemStore', + alias: UMB_USER_ITEM_STORE_ALIAS, + name: 'User Item Store', + api: UmbUserItemStore, +}; + +export const manifests = [itemRepository, itemStore]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.repository.ts index 4a0e976ca3..759cc1700a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.repository.ts @@ -1,44 +1,11 @@ -import { UmbUserRepositoryBase } from '../user-repository-base.js'; import { UmbUserItemServerDataSource } from './user-item.server.data.js'; +import { UMB_USER_ITEM_STORE_CONTEXT } from './user-item.store.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbItemDataSource, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; import { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export class UmbUserItemRepository extends UmbUserRepositoryBase implements UmbItemRepository { - #itemSource: UmbItemDataSource; - +export class UmbUserItemRepository extends UmbItemRepositoryBase { constructor(host: UmbControllerHost) { - super(host); - this.#itemSource = new UmbUserItemServerDataSource(host); - } - - /** - * Requests the user items for the given ids - * @param {Array} ids - * @return {*} - * @memberof UmbUserItemRepository - */ - async requestItems(ids: Array) { - if (!ids) throw new Error('Ids are missing'); - await this.init; - - const { data, error } = await this.#itemSource.getItems(ids); - - if (data) { - this.itemStore?.appendItems(data); - } - - return { data, error, asObservable: () => this.itemStore!.items(ids) }; - } - - /** - * Returns a promise with an observable of the user items for the given ids - * @param {Array} ids - * @return {Promise>} - * @memberof UmbUserItemRepository - */ - async items(ids: Array) { - await this.init; - return this.itemStore!.items(ids); + super(host, UmbUserItemServerDataSource, UMB_USER_ITEM_STORE_CONTEXT); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.store.ts index 16a563cdc0..a14bbf062d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.store.ts @@ -21,11 +21,7 @@ export class UmbUserItemStore * @memberof UmbUserItemStore */ constructor(host: UmbControllerHostElement) { - super( - host, - UMB_USER_ITEM_STORE_CONTEXT_TOKEN.toString(), - new UmbArrayState([], (x) => x.id) - ); + super(host, UMB_USER_ITEM_STORE_CONTEXT.toString(), new UmbArrayState([], (x) => x.id)); } items(ids: Array) { @@ -33,4 +29,4 @@ export class UmbUserItemStore } } -export const UMB_USER_ITEM_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbUserItemStore'); +export const UMB_USER_ITEM_STORE_CONTEXT = new UmbContextToken('UmbUserItemStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/manifests.ts index ff86ffbbeb..a4ccd4441b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/manifests.ts @@ -1,12 +1,12 @@ import { UmbUserRepository } from './user.repository.js'; -import { UmbUserItemStore } from './item/user-item.store.js'; import { UmbUserStore } from './user.store.js'; import { UmbDisableUserRepository } from './disable/disable-user.repository.js'; import { UmbEnableUserRepository } from './enable/enable-user.repository.js'; import { UmbChangeUserPasswordRepository } from './change-password/change-user-password.repository.js'; import { UmbUnlockUserRepository } from './unlock/unlock-user.repository.js'; import { UmbInviteUserRepository } from './invite/invite-user.repository.js'; -import type { ManifestStore, ManifestRepository, ManifestItemStore } from '@umbraco-cms/backoffice/extension-registry'; +import { manifests as itemManifests } from './item/manifests.js'; +import type { ManifestStore, ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; export const USER_REPOSITORY_ALIAS = 'Umb.Repository.User'; const repository: ManifestRepository = { @@ -63,13 +63,6 @@ const store: ManifestStore = { api: UmbUserStore, }; -const itemStore: ManifestItemStore = { - type: 'itemStore', - alias: 'Umb.ItemStore.User', - name: 'User Store', - api: UmbUserItemStore, -}; - export const manifests = [ repository, disableRepository, @@ -78,5 +71,5 @@ export const manifests = [ unlockRepository, inviteRepository, store, - itemStore, + ...itemManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user-repository-base.ts index 5245117f59..1cdf85f57e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user-repository-base.ts @@ -1,5 +1,5 @@ import { UMB_USER_STORE_CONTEXT_TOKEN, UmbUserStore } from './user.store.js'; -import { UMB_USER_ITEM_STORE_CONTEXT_TOKEN, UmbUserItemStore } from './item/user-item.store.js'; +import { UMB_USER_ITEM_STORE_CONTEXT, UmbUserItemStore } from './item/user-item.store.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_NOTIFICATION_CONTEXT_TOKEN, UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; @@ -19,13 +19,13 @@ export class UmbUserRepositoryBase extends UmbRepositoryBase { this.detailStore = instance; }).asPromise(), - this.consumeContext(UMB_USER_ITEM_STORE_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_USER_ITEM_STORE_CONTEXT, (instance) => { this.itemStore = instance; }).asPromise(), this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { this.notificationContext = instance; - }).asPromise() + }).asPromise(), ]); } }