diff --git a/src/Umbraco.Web.UI.Client/.eslintrc.json b/src/Umbraco.Web.UI.Client/.eslintrc.json index 6ccad7596e..8b9cfa72ac 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ b/src/Umbraco.Web.UI.Client/.eslintrc.json @@ -39,26 +39,31 @@ "import/no-unresolved": "off", "import/order": "warn", "local-rules/bad-type-import": "error", + "local-rules/enforce-element-suffix-on-element-class-name": "error", + "local-rules/enforce-umb-prefix-on-element-name": "error", + "local-rules/ensure-relative-import-use-js-extension": "error", "local-rules/no-direct-api-import": "warn", "local-rules/prefer-import-aliases": "error", - "local-rules/enforce-element-suffix-on-element-class-name": "error", - "local-rules/umb-class-prefix": "error", "local-rules/prefer-static-styles-last": "warn", - "local-rules/ensure-relative-import-use-js-extension": "error", + "local-rules/umb-class-prefix": "error", "local-rules/enforce-umbraco-external-imports": [ "error", { "exceptions": ["@umbraco-cms", "@open-wc/testing", "@storybook", "msw", "."] } ], - "local-rules/exported-string-constant-naming": ["error", + "local-rules/exported-string-constant-naming": [ + "error", { "excludedFileNames": ["umbraco-package", "input-tiny-mce.defaults"] // TODO: what to do about the tiny mce defaults? } ], "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-unused-vars": "warn" + "@typescript-eslint/no-unused-vars": "warn", + "@typescript-eslint/consistent-type-exports": "error", + "@typescript-eslint/consistent-type-imports": "error", + "@typescript-eslint/no-import-type-side-effects": "warn" }, "settings": { "import/parsers": { diff --git a/src/Umbraco.Web.UI.Client/.github/workflows/dependency-review.yml b/src/Umbraco.Web.UI.Client/.github/workflows/dependency-review.yml index 4e75197790..0d4a01360d 100644 --- a/src/Umbraco.Web.UI.Client/.github/workflows/dependency-review.yml +++ b/src/Umbraco.Web.UI.Client/.github/workflows/dependency-review.yml @@ -17,4 +17,4 @@ jobs: - name: 'Checkout Repository' uses: actions/checkout@v4 - name: 'Dependency Review' - uses: actions/dependency-review-action@v3 + uses: actions/dependency-review-action@v4 diff --git a/src/Umbraco.Web.UI.Client/.storybook/preview.js b/src/Umbraco.Web.UI.Client/.storybook/preview.js index 473679ec63..a6fb5b33ac 100644 --- a/src/Umbraco.Web.UI.Client/.storybook/preview.js +++ b/src/Umbraco.Web.UI.Client/.storybook/preview.js @@ -9,7 +9,7 @@ import { setCustomElements } from '@storybook/web-components'; import { startMockServiceWorker } from '../src/mocks'; -import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '../src/packages/core/modal'; +import { UMB_MODAL_MANAGER_CONTEXT, UmbModalManagerContext } from '../src/packages/core/modal'; 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/tree/document-tree.store'; @@ -35,7 +35,7 @@ class UmbStoryBookElement extends UmbLitElement { super(); this._umbIconRegistry.attach(this); this._registerExtensions(documentManifests); - this.provideContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, new UmbModalManagerContext(this)); + this.provideContext(UMB_MODAL_MANAGER_CONTEXT, new UmbModalManagerContext(this)); this._registerExtensions(localizationManifests); umbLocalizationRegistry.loadLanguage('en-us'); // register default language diff --git a/src/Umbraco.Web.UI.Client/README.md b/src/Umbraco.Web.UI.Client/README.md index 6308975ef4..3417b276db 100644 --- a/src/Umbraco.Web.UI.Client/README.md +++ b/src/Umbraco.Web.UI.Client/README.md @@ -44,7 +44,7 @@ Then create a dashboard.js file the same folder. ```javascript import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import { UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; const template = document.createElement('template'); template.innerHTML = ` @@ -75,7 +75,7 @@ export default class MyDashboardElement extends UmbElementMixin(HTMLElement) { this.shadowRoot.getElementById('clickMe').addEventListener('click', this.onClick.bind(this)); - this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (_instance) => { + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (_instance) => { this.#notificationContext = _instance; }); } @@ -109,7 +109,7 @@ Then go to the element located in `src/my-element.ts` and replace it with the fo // src/my-element.ts import { LitElement, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; +import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; @customElement('my-element') export default class MyElement extends UmbElementMixin(LitElement) { @@ -117,7 +117,7 @@ export default class MyElement extends UmbElementMixin(LitElement) { constructor() { super(); - this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (_instance) => { + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (_instance) => { this._notificationContext = _instance; }); } diff --git a/src/Umbraco.Web.UI.Client/devops/eslint/rules/enforce-umb-prefix-on-element-name.cjs b/src/Umbraco.Web.UI.Client/devops/eslint/rules/enforce-umb-prefix-on-element-name.cjs new file mode 100644 index 0000000000..5db023e932 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/devops/eslint/rules/enforce-umb-prefix-on-element-name.cjs @@ -0,0 +1,41 @@ +/** @type {import('eslint').Rule.RuleModule} */ +module.exports = { + meta: { + type: 'suggestion', + docs: { + description: 'Enforce Custom Element names to start with "umb-".', + category: 'Naming', + recommended: true, + }, + schema: [], + }, + create: function (context) { + return { + CallExpression(node) { + // check if the expression is @customElement decorator + const isCustomElementDecorator = + node.callee.type === 'Identifier' && + node.callee.name === 'customElement' && + node.arguments.length === 1 && + node.arguments[0].type === 'Literal' && + typeof node.arguments[0].value === 'string'; + + if (isCustomElementDecorator) { + const elementName = node.arguments[0].value; + + // check if the element name starts with 'umb-', or 'test-', to be allow tests to have custom elements: + const isElementNameValid = elementName.startsWith('umb-') ? true : elementName.startsWith('test-'); + + if (!isElementNameValid) { + context.report({ + node, + message: 'Custom Element name should start with "umb-".', + // There is no fixer on purpose because it's not safe to automatically rename the element name. + // Renaming should be done manually with consideration of potential impacts. + }); + } + } + }, + }; + }, +}; diff --git a/src/Umbraco.Web.UI.Client/docs/authentication.md b/src/Umbraco.Web.UI.Client/docs/authentication.md index 2b24ac2369..e0376e9c24 100644 --- a/src/Umbraco.Web.UI.Client/docs/authentication.md +++ b/src/Umbraco.Web.UI.Client/docs/authentication.md @@ -34,7 +34,7 @@ There are two ways to use this: ```json "Umbraco": { "CMS": { - "NewBackOffice":{ + "Security":{ "BackOfficeHost": "http://localhost:5173", "AuthorizeCallbackPathName": "/" }, diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index 1f7e56aea0..6f720a1a7d 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -2,8 +2,10 @@ const badTypeImportRule = require('./devops/eslint/rules/bad-type-import.cjs'); const enforceElementSuffixOnElementClassNameRule = require('./devops/eslint/rules/enforce-element-suffix-on-element-class-name.cjs'); +const enforceUmbPrefixOnElementNameRule = require('./devops/eslint/rules/enforce-umb-prefix-on-element-name.cjs'); const enforceUmbracoExternalImportsRule = require('./devops/eslint/rules/enforce-umbraco-external-imports.cjs'); const ensureRelativeImportUseJsExtensionRule = require('./devops/eslint/rules/ensure-relative-import-use-js-extension.cjs'); +const exportedStringConstantNaming = require('./devops/eslint/rules/exported-string-constant-naming.cjs'); const noDirectApiImportRule = require('./devops/eslint/rules/no-direct-api-import.cjs'); const preferImportAliasesRule = require('./devops/eslint/rules/prefer-import-aliases.cjs'); const preferStaticStylesLastRule = require('./devops/eslint/rules/prefer-static-styles-last.cjs'); @@ -12,11 +14,12 @@ const umbClassPrefixRule = require('./devops/eslint/rules/umb-class-prefix.cjs') module.exports = { 'bad-type-import': badTypeImportRule, 'enforce-element-suffix-on-element-class-name': enforceElementSuffixOnElementClassNameRule, + 'enforce-umb-prefix-on-element-name': enforceUmbPrefixOnElementNameRule, 'enforce-umbraco-external-imports': enforceUmbracoExternalImportsRule, 'ensure-relative-import-use-js-extension': ensureRelativeImportUseJsExtensionRule, + 'exported-string-constant-naming': exportedStringConstantNaming, 'no-direct-api-import': noDirectApiImportRule, 'prefer-import-aliases': preferImportAliasesRule, 'prefer-static-styles-last': preferStaticStylesLastRule, 'umb-class-prefix': umbClassPrefixRule, - 'exported-string-constant-naming': require('./devops/eslint/rules/exported-string-constant-naming.cjs'), }; diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/README.md b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/README.md new file mode 100644 index 0000000000..a5f65cf26b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/README.md @@ -0,0 +1,3 @@ +# Property Dataset Dashboard Example + +This example demonstrates how to set up the Sorter and how it can be used in nested setups. diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/index.ts b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/index.ts new file mode 100644 index 0000000000..0771859fe9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/index.ts @@ -0,0 +1,15 @@ +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'dashboard', + name: 'Example Sorter Dashboard', + alias: 'example.dashboard.dataset', + element: () => import('./sorter-dashboard.js'), + weight: 900, + meta: { + label: 'Sorter example', + pathname: 'sorter-example', + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-dashboard.ts b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-dashboard.ts new file mode 100644 index 0000000000..daefba21f6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-dashboard.ts @@ -0,0 +1,90 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { css, html, customElement, LitElement } from '@umbraco-cms/backoffice/external/lit'; +import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; +import type { ModelEntryType } from './sorter-group.js'; + +import './sorter-group.js'; +@customElement('example-sorter-dashboard') +export class ExampleSorterDashboard extends UmbElementMixin(LitElement) { + groupOneItems: ModelEntryType[] = [ + { + name: 'Apple', + children: [ + { + name: 'Juice', + }, + { + name: 'Milk', + }, + ], + }, + { + name: 'Banana', + children: [], + }, + { + name: 'Pear', + }, + { + name: 'Pineapple', + }, + { + name: 'Lemon', + children: [ + { + name: 'Cola', + }, + { + name: 'Pepsi', + }, + ], + }, + ]; + + groupTwoItems: ModelEntryType[] = [ + { + name: 'DXP', + }, + { + name: 'H5YR', + }, + { + name: 'UUI', + }, + ]; + + render() { + return html` + +
+
Notice this example still only support single group of Sorter.
+ + +
+
+ `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + padding: var(--uui-size-layout-1); + } + + .outer-wrapper { + display: flex; + gap: var(--uui-size-layout-1); + } + `, + ]; +} + +export default ExampleSorterDashboard; + +declare global { + interface HTMLElementTagNameMap { + 'example-sorter-dashboard-nested': ExampleSorterDashboard; + } +} diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-group.ts b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-group.ts new file mode 100644 index 0000000000..d1a0c7e35e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-group.ts @@ -0,0 +1,103 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { css, html, customElement, LitElement, repeat, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; +import { UmbSorterConfig, UmbSorterController } from '@umbraco-cms/backoffice/sorter'; + +import './sorter-item.js'; +import ExampleSorterItem from './sorter-item.js'; + +export type ModelEntryType = { + name: string; + children?: ModelEntryType[]; +}; + +@customElement('example-sorter-group') +export class ExampleSorterGroup extends UmbElementMixin(LitElement) { + @property({ type: Array, attribute: false }) + public get initialItems(): ModelEntryType[] { + return this.items; + } + public set initialItems(value: ModelEntryType[]) { + // Only want to set the model initially, cause any re-render should not set this again. + if (this._items !== undefined) return; + this.items = value; + } + + @property({ type: Array, attribute: false }) + public get items(): ModelEntryType[] { + return this._items ?? []; + } + public set items(value: ModelEntryType[]) { + const oldValue = this._items; + this._items = value; + this.#sorter.setModel(this._items); + this.requestUpdate('items', oldValue); + } + private _items?: ModelEntryType[]; + + #sorter = new UmbSorterController(this, { + getUniqueOfElement: (element) => { + return element.name; + }, + getUniqueOfModel: (modelEntry) => { + return modelEntry.name; + }, + identifier: 'string-that-identifies-all-example-sorters', + itemSelector: 'example-sorter-item', + containerSelector: '.sorter-container', + onChange: ({ model }) => { + const oldValue = this._items; + this._items = model; + this.requestUpdate('items', oldValue); + }, + }); + + removeItem = (item: ModelEntryType) => { + this.items = this.items.filter((r) => r.name !== item.name); + }; + + render() { + return html` +
+ ${repeat( + this.items, + (item) => item.name, + (item) => + html` + + ${item.children ? html`` : ''} + `, + )} +
+ `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + width: 100%; + border: 1px dashed rgba(122, 122, 122, 0.25); + border-radius: calc(var(--uui-border-radius) * 2); + padding: var(--uui-size-space-1); + } + + .sorter-placeholder { + opacity: 0.2; + } + + .sorter-container { + min-height: 20px; + } + `, + ]; +} + +export default ExampleSorterGroup; + +declare global { + interface HTMLElementTagNameMap { + 'example-sorter-group-nested': ExampleSorterGroup; + } +} diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-item.ts b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-item.ts new file mode 100644 index 0000000000..a3f7ef5fb3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-nested-containers/sorter-item.ts @@ -0,0 +1,58 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { css, html, customElement, LitElement, state, repeat, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; +import { UmbSorterConfig, UmbSorterController } from '@umbraco-cms/backoffice/sorter'; + +@customElement('example-sorter-item') +export class ExampleSorterItem extends UmbElementMixin(LitElement) { + @property({ type: String, reflect: true }) + name: string = ''; + + @property({ type: Boolean, reflect: true, attribute: 'drag-placeholder' }) + umbDragPlaceholder = false; + + render() { + return html` +
+ ${this.name} + + +
+ + `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + padding: var(--uui-size-layout-1); + border: 1px solid var(--uui-color-border); + border-radius: var(--uui-border-radius); + margin-bottom: 3px; + } + :host([drag-placeholder]) { + opacity: 0.2; + } + + div { + display: flex; + align-items: center; + justify-content: space-between; + } + + slot:not([name]) { + // go on new line: + } + `, + ]; +} + +export default ExampleSorterItem; + +declare global { + interface HTMLElementTagNameMap { + 'example-sorter-item-nested': ExampleSorterItem; + } +} diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/README.md b/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/README.md index 3dc57f3788..b92b05220d 100644 --- a/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/README.md +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/README.md @@ -1,5 +1,3 @@ # Property Dataset Dashboard Example -This example demonstrates the how to setup the Sorter. - -This example can still NOT sort between two groups. This will come later. +This example demonstrates how to set up the Sorter, and how it can be linked with another Sorter. diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-dashboard.ts b/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-dashboard.ts index 0e88318ab3..feb0979603 100644 --- a/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-dashboard.ts +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-dashboard.ts @@ -40,7 +40,6 @@ export class ExampleSorterDashboard extends UmbElementMixin(LitElement) { return html`
-
Notice this example still only support single group of Sorter.
@@ -58,6 +57,7 @@ export class ExampleSorterDashboard extends UmbElementMixin(LitElement) { .outer-wrapper { display: flex; + gap: var(--uui-size-layout-1); } `, ]; diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-group.ts b/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-group.ts index 4ce3125463..da4b209172 100644 --- a/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-group.ts +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-group.ts @@ -10,73 +10,42 @@ export type ModelEntryType = { name: string; }; -const SORTER_CONFIG: UmbSorterConfig = { - compareElementToModel: (element, model) => { - return element.name === model.name; - }, - querySelectModelToElement: (container, modelEntry) => { - return container.querySelector("example-sorter-item[name='" + modelEntry.name + "']"); - }, - identifier: 'string-that-identifies-all-example-sorters', - itemSelector: 'example-sorter-item', - containerSelector: '.sorter-container', -}; - @customElement('example-sorter-group') export class ExampleSorterGroup extends UmbElementMixin(LitElement) { + // + // Property that is used to set the model of the sorter. @property({ type: Array, attribute: false }) public get items(): ModelEntryType[] { - return this._items; + return this._items ?? []; } public set items(value: ModelEntryType[]) { + // Only want to set the model initially via this one, as this is the initial model, cause any re-render should not set this data again. + if (this._items !== undefined) return; this._items = value; this.#sorter.setModel(this._items); } - private _items: ModelEntryType[] = []; + private _items?: ModelEntryType[]; #sorter = new UmbSorterController(this, { - ...SORTER_CONFIG, - /*performItemInsert: ({ item, newIndex }) => { - const oldValue = this._items; - //console.log('inserted', item.name, 'at', newIndex, ' ', this._items.map((x) => x.name).join(', ')); - const newItems = [...this._items]; - newItems.splice(newIndex, 0, item); - this.items = newItems; - this.requestUpdate('_items', oldValue); - return true; + getUniqueOfElement: (element) => { + return element.name; }, - performItemRemove: ({ item }) => { - const oldValue = this._items; - //console.log('removed', item.name, 'at', indexToMove, ' ', this._items.map((x) => x.name).join(', ')); - const indexToMove = this._items.findIndex((x) => x.name === item.name); - const newItems = [...this._items]; - newItems.splice(indexToMove, 1); - this.items = newItems; - this.requestUpdate('_items', oldValue); - return true; + getUniqueOfModel: (modelEntry) => { + return modelEntry.name; }, - performItemMove: ({ item, newIndex, oldIndex }) => { - const oldValue = this._items; - //console.log('move', item.name, 'from', oldIndex, 'to', newIndex, ' ', this._items.map((x) => x.name).join(', ')); - const newItems = [...this._items]; - newItems.splice(oldIndex, 1); - if (oldIndex <= newIndex) { - newIndex--; - } - newItems.splice(newIndex, 0, item); - this.items = newItems; - this.requestUpdate('_items', oldValue); - return true; - },*/ + identifier: 'string-that-identifies-all-example-sorters', + itemSelector: 'example-sorter-item', + containerSelector: '.sorter-container', onChange: ({ model }) => { const oldValue = this._items; this._items = model; - this.requestUpdate('_items', oldValue); + this.requestUpdate('items', oldValue); }, }); removeItem = (item: ModelEntryType) => { - this.items = this._items.filter((r) => r.name !== item.name); + this._items = this._items!.filter((r) => r.name !== item.name); + this.#sorter.setModel(this._items); }; render() { @@ -87,7 +56,7 @@ export class ExampleSorterGroup extends UmbElementMixin(LitElement) { (item) => item.name, (item) => html` - + `, )} @@ -100,11 +69,18 @@ export class ExampleSorterGroup extends UmbElementMixin(LitElement) { :host { display: block; width: 100%; + border: 1px dashed rgba(122, 122, 122, 0.25); + border-radius: calc(var(--uui-border-radius) * 2); + padding: var(--uui-size-space-1); } .sorter-placeholder { opacity: 0.2; } + + .sorter-container { + min-height: 20px; + } `, ]; } diff --git a/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-item.ts b/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-item.ts index 495370bb00..3dd7f0b5e7 100644 --- a/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-item.ts +++ b/src/Umbraco.Web.UI.Client/examples/sorter-with-two-containers/sorter-item.ts @@ -13,8 +13,11 @@ export class ExampleSorterItem extends UmbElementMixin(LitElement) { render() { return html` - ${this.name} - +
+ ${this.name} + + +
`; } @@ -23,9 +26,7 @@ export class ExampleSorterItem extends UmbElementMixin(LitElement) { UmbTextStyles, css` :host { - display: flex; - align-items: center; - justify-content: space-between; + display: block; padding: var(--uui-size-layout-1); border: 1px solid var(--uui-color-border); border-radius: var(--uui-border-radius); @@ -34,6 +35,16 @@ export class ExampleSorterItem extends UmbElementMixin(LitElement) { :host([drag-placeholder]) { opacity: 0.2; } + + div { + display: flex; + align-items: center; + justify-content: space-between; + } + + slot:not([name]) { + // go on new line: + } `, ]; } diff --git a/src/Umbraco.Web.UI.Client/examples/workspace-context-counter/counter-workspace-context.ts b/src/Umbraco.Web.UI.Client/examples/workspace-context-counter/counter-workspace-context.ts index 9d3988074d..06b7ae2a1a 100644 --- a/src/Umbraco.Web.UI.Client/examples/workspace-context-counter/counter-workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/examples/workspace-context-counter/counter-workspace-context.ts @@ -16,7 +16,7 @@ export class WorkspaceContextCounter extends UmbBaseController { // Lets expose methods to update the state: increment() { - this.#counter.next(this.#counter.value + 1); + this.#counter.setValue(this.#counter.value + 1); } } diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index bce5b7150b..c702b8fb44 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1,19 +1,19 @@ { "name": "@umbraco-cms/backoffice", - "version": "14.0.0--preview004", + "version": "14.0.0--preview005", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@umbraco-cms/backoffice", - "version": "14.0.0--preview004", + "version": "14.0.0--preview005", "license": "MIT", "dependencies": { "@openid/appauth": "^1.3.1", "@types/dompurify": "^3.0.5", - "@types/uuid": "^9.0.7", - "@umbraco-ui/uui": "1.6.0-rc.3", - "@umbraco-ui/uui-css": "1.6.0-rc.3", + "@types/uuid": "^9.0.8", + "@umbraco-ui/uui": "1.6.2", + "@umbraco-ui/uui-css": "1.6.0", "dompurify": "^3.0.6", "element-internals-polyfill": "^1.3.9", "lit": "^3.1.2", @@ -29,7 +29,7 @@ "@babel/core": "^7.23.7", "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^4.0.0", - "@playwright/test": "^1.40.1", + "@playwright/test": "^1.41.1", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", @@ -70,7 +70,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "remark-gfm": "^3.0.1", - "rollup": "^4.9.4", + "rollup": "^4.9.6", "rollup-plugin-esbuild": "^6.1.0", "rollup-plugin-import-css": "^3.4.0", "rollup-plugin-web-worker-loader": "^1.6.1", @@ -80,7 +80,7 @@ "typescript": "^5.3.3", "typescript-json-schema": "^0.62.0", "vite": "^5.0.11", - "vite-plugin-static-copy": "^1.0.0", + "vite-plugin-static-copy": "^1.0.1", "vite-tsconfig-paths": "^4.2.3", "web-component-analyzer": "^2.0.0" }, @@ -198,9 +198,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -208,11 +208,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -227,12 +227,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/@babel/generator": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", @@ -289,9 +283,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", + "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -329,9 +323,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -554,14 +548,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -582,9 +576,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -949,9 +943,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1323,9 +1317,9 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "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==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", @@ -1740,9 +1734,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", @@ -1772,7 +1766,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", "@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.4", @@ -1794,7 +1788,7 @@ "@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-systemjs": "^7.23.9", "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", @@ -1820,9 +1814,9 @@ "@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-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2018,35 +2012,35 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", - "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -2055,8 +2049,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2065,9 +2059,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -2128,10 +2122,26 @@ "react": ">=16.8.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ "arm" ], @@ -2145,9 +2155,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ "arm64" ], @@ -2161,9 +2171,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "cpu": [ "x64" ], @@ -2177,9 +2187,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], @@ -2193,9 +2203,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "cpu": [ "x64" ], @@ -2209,9 +2219,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "cpu": [ "arm64" ], @@ -2225,9 +2235,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "cpu": [ "x64" ], @@ -2241,9 +2251,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "cpu": [ "arm" ], @@ -2257,9 +2267,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "cpu": [ "arm64" ], @@ -2273,9 +2283,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "cpu": [ "ia32" ], @@ -2289,9 +2299,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" ], @@ -2305,9 +2315,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "cpu": [ "mips64el" ], @@ -2321,9 +2331,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "cpu": [ "ppc64" ], @@ -2337,9 +2347,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "cpu": [ "riscv64" ], @@ -2353,9 +2363,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ "s390x" ], @@ -2369,9 +2379,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ "x64" ], @@ -2385,9 +2395,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" ], @@ -2401,9 +2411,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "cpu": [ "x64" ], @@ -2417,9 +2427,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" ], @@ -2433,9 +2443,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" ], @@ -2449,9 +2459,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" ], @@ -2465,9 +2475,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -2496,9 +2506,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2533,10 +2543,20 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2560,6 +2580,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -2597,31 +2629,31 @@ "dev": true }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dev": true, "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", + "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", "dev": true, "dependencies": { - "@floating-ui/core": "^1.5.3", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.5.tgz", - "integrity": "sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.6.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -2635,19 +2667,41 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2662,9 +2716,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@import-maps/resolve": { @@ -2924,12 +2978,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3035,9 +3083,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -3053,19 +3101,19 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jsdevtools/ono": { @@ -3086,20 +3134,20 @@ "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==" }, "node_modules/@lit/reactive-element": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.1.tgz", - "integrity": "sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.0.0" + "@lit-labs/ssr-dom-shim": "^1.2.0" } }, "node_modules/@ljharb/through": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", - "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "version": "2.3.12", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz", + "integrity": "sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.5" }, "engines": { "node": ">= 0.4" @@ -3262,9 +3310,9 @@ "dev": true }, "node_modules/@open-wc/scoped-elements": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-3.0.3.tgz", - "integrity": "sha512-ur6fWLsZ8C7l6xg5YpmvT/0/QdxUPtHo7t1PgwMtIN6YgPaJrP8O/Ho3RBBOXqbea7dHGlRegCOwxCcYuYjUyg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-3.0.5.tgz", + "integrity": "sha512-q4U+hFTQQRyorJILOpmBm6PY2hgjCnQe214nXJNjbJMQ9EvT55oyZ7C8BY5aFYJkytUyBoawlMpZt4F2xjdzHw==", "dev": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.4.0", @@ -3272,13 +3320,13 @@ } }, "node_modules/@open-wc/semantic-dom-diff": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.20.0.tgz", - "integrity": "sha512-qGHl3nkXluXsjpLY9bSZka/cnlrybPtJMs6RjmV/OP4ID7Gcz1uNWQks05pAhptDB1R47G6PQjdwxG8dXl1zGA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.20.1.tgz", + "integrity": "sha512-mPF/RPT2TU7Dw41LEDdaeP6eyTOWBD4z0+AHP4/d0SbgcfJZVRymlIB6DQmtz0fd2CImIS9kszaMmwMt92HBPA==", "dev": true, "dependencies": { "@types/chai": "^4.3.1", - "@web/test-runner-commands": "^0.7.0" + "@web/test-runner-commands": "^0.9.0" } }, "node_modules/@open-wc/testing": { @@ -3330,12 +3378,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz", - "integrity": "sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==", + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.2.tgz", + "integrity": "sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==", "dev": true, "dependencies": { - "playwright": "1.40.1" + "playwright": "1.41.2" }, "bin": { "playwright": "cli.js" @@ -3373,6 +3421,24 @@ } } }, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@radix-ui/number": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", @@ -4150,9 +4216,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz", - "integrity": "sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", "cpu": [ "arm" ], @@ -4163,9 +4229,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.4.tgz", - "integrity": "sha512-ehcBrOR5XTl0W0t2WxfTyHCR/3Cq2jfb+I4W+Ch8Y9b5G+vbAecVv0Fx/J1QKktOrgUYsIKxWAKgIpvw56IFNA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", "cpu": [ "arm64" ], @@ -4176,9 +4242,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz", - "integrity": "sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", "cpu": [ "arm64" ], @@ -4189,9 +4255,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.4.tgz", - "integrity": "sha512-Gc6cukkF38RcYQ6uPdiXi70JB0f29CwcQ7+r4QpfNpQFVHXRd0DfWFidoGxjSx1DwOETM97JPz1RXL5ISSB0pA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", "cpu": [ "x64" ], @@ -4202,9 +4268,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.4.tgz", - "integrity": "sha512-g21RTeFzoTl8GxosHbnQZ0/JkuFIB13C3T7Y0HtKzOXmoHhewLbVTFBQZu+z5m9STH6FZ7L/oPgU4Nm5ErN2fw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", "cpu": [ "arm" ], @@ -4215,9 +4281,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.4.tgz", - "integrity": "sha512-TVYVWD/SYwWzGGnbfTkrNpdE4HON46orgMNHCivlXmlsSGQOx/OHHYiQcMIOx38/GWgwr/po2LBn7wypkWw/Mg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", "cpu": [ "arm64" ], @@ -4228,9 +4294,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.4.tgz", - "integrity": "sha512-XcKvuendwizYYhFxpvQ3xVpzje2HHImzg33wL9zvxtj77HvPStbSGI9czrdbfrf8DGMcNNReH9pVZv8qejAQ5A==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", "cpu": [ "arm64" ], @@ -4241,9 +4307,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.4.tgz", - "integrity": "sha512-LFHS/8Q+I9YA0yVETyjonMJ3UA+DczeBd/MqNEzsGSTdNvSJa1OJZcSH8GiXLvcizgp9AlHs2walqRcqzjOi3A==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", "cpu": [ "riscv64" ], @@ -4254,9 +4320,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.4.tgz", - "integrity": "sha512-dIYgo+j1+yfy81i0YVU5KnQrIJZE8ERomx17ReU4GREjGtDW4X+nvkBak2xAUpyqLs4eleDSj3RrV72fQos7zw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", "cpu": [ "x64" ], @@ -4267,9 +4333,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.4.tgz", - "integrity": "sha512-RoaYxjdHQ5TPjaPrLsfKqR3pakMr3JGqZ+jZM0zP2IkDtsGa4CqYaWSfQmZVgFUCgLrTnzX+cnHS3nfl+kB6ZQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", "cpu": [ "x64" ], @@ -4280,9 +4346,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.4.tgz", - "integrity": "sha512-T8Q3XHV+Jjf5e49B4EAaLKV74BbX7/qYBRQ8Wop/+TyyU0k+vSjiLVSHNWdVd1goMjZcbhDmYZUYW5RFqkBNHQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", "cpu": [ "arm64" ], @@ -4293,9 +4359,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.4.tgz", - "integrity": "sha512-z+JQ7JirDUHAsMecVydnBPWLwJjbppU+7LZjffGf+Jvrxq+dVjIE7By163Sc9DKc3ADSU50qPVw0KonBS+a+HQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", "cpu": [ "ia32" ], @@ -4306,9 +4372,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.4.tgz", - "integrity": "sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", "cpu": [ "x64" ], @@ -4605,395 +4671,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, "node_modules/@storybook/builder-vite": { "version": "7.6.7", "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.6.7.tgz", @@ -5154,6 +4831,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@storybook/cli/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@storybook/cli/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5269,6 +4956,18 @@ "node": ">=4.0.0" } }, + "node_modules/@storybook/cli/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@storybook/cli/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -5336,9 +5035,9 @@ } }, "node_modules/@storybook/cli/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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5506,362 +5205,10 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "18.19.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.5.tgz", - "integrity": "sha512-22MG6T02Hos2JWfa1o5jsIByn+bc5iOt1IS4xyg6OG68Bu+wMonVZzdrgCw693++rpLE9RUT/Bx15BeDzO0j+g==", + "version": "18.19.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.14.tgz", + "integrity": "sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5882,15 +5229,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@storybook/core-common/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/@storybook/core-common/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5907,43 +5245,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@storybook/core-common/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, "node_modules/@storybook/core-common/node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -5975,21 +5276,6 @@ "node": ">=8" } }, - "node_modules/@storybook/core-common/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@storybook/core-common/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6069,9 +5355,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "18.19.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.5.tgz", - "integrity": "sha512-22MG6T02Hos2JWfa1o5jsIByn+bc5iOt1IS4xyg6OG68Bu+wMonVZzdrgCw693++rpLE9RUT/Bx15BeDzO0j+g==", + "version": "18.19.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.14.tgz", + "integrity": "sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6130,9 +5416,9 @@ } }, "node_modules/@storybook/core-server/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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -6550,18 +5836,18 @@ "dev": true }, "node_modules/@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/babel__code-frame": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.3.tgz", - "integrity": "sha512-2TN6oiwtNjOezilFVl77zwdNPwQWaDBBCCWWxyo1ctiO3vAtd7H/aB/CBJdw9+kqq3+latD0SXoedIuHySSZWw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.6.tgz", + "integrity": "sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==", "dev": true }, "node_modules/@types/babel__core": { @@ -6606,14 +5892,14 @@ } }, "node_modules/@types/base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ZmI0sZGAUNXUfMWboWwi4LcfpoVUYldyN6Oe0oJ5cCsHDU/LlRq8nQKPXhYLOx36QYSW9bNIb1vvRrD6K7Llgw==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/base64-js/-/base64-js-1.3.2.tgz", + "integrity": "sha512-Q2Xn2/vQHRGLRXhQ5+BSLwhHkR3JVflxVKywH0Q6fVoAiUE8fFYL2pE5/l2ZiOiBDfA8qUqRnSxln4G/NFz1Sg==" }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", @@ -6621,24 +5907,24 @@ } }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", + "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", "dev": true }, "node_modules/@types/chai-dom": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-1.11.0.tgz", - "integrity": "sha512-Aja99Mmnny+Sz+T2hBK3oEsrcy18yabplT0pGX/QwIke9jMJHdvHlV2f4Tmq5SqxTMYwt1Zjbisv/4r83EUIHw==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-1.11.3.tgz", + "integrity": "sha512-EUEZI7uID4ewzxnU7DJXtyvykhQuwe+etJ1wwOiJyQRTH/ifMWKX+ghiXkxCUvNJ6IQDodf0JXhuP6zZcy2qXQ==", "dev": true, "dependencies": { "@types/chai": "*" } }, "node_modules/@types/co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.3.tgz", + "integrity": "sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==", "dev": true, "dependencies": { "@types/node": "*", @@ -6652,24 +5938,24 @@ "dev": true }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/content-disposition": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz", - "integrity": "sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==", "dev": true }, "node_modules/@types/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-QUm4YOC/ENo0VjPVl2o8HGyTbHHQGDOw8PCg3rXBucYHKyZN/XjXRbPFAV1tB2FvM0/wyFoDct4cTIctzKrQFg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-2.0.3.tgz", + "integrity": "sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA==", "dev": true }, "node_modules/@types/cookie": { @@ -6679,9 +5965,9 @@ "dev": true }, "node_modules/@types/cookies": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", - "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", "dev": true, "dependencies": { "@types/connect": "*", @@ -6700,15 +5986,15 @@ } }, "node_modules/@types/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-epMsEE85fi4lfmJUH/89/iV/LI+F5CvNIvmgs5g5jYFPfhO2S/ae8WSsLOKWdwtoaZw9Q2IhJ4tQ5tFCcS/4HA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz", + "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", "dev": true }, "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { "@types/ms": "*" @@ -6753,9 +6039,9 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -6765,9 +6051,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", "dev": true, "dependencies": { "@types/node": "*", @@ -6783,9 +6069,9 @@ "dev": true }, "node_modules/@types/fined": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.4.tgz", - "integrity": "sha512-mZ0onxTS5OyfSwBNecTKT0h79e4XXHrc9RI5tQfEAf+Fp6NbBmNnc0kg59HO+97V+y3opS+sfo4k4qpYwLt6NQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.5.tgz", + "integrity": "sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==", "dev": true }, "node_modules/@types/graceful-fs": { @@ -6798,21 +6084,21 @@ } }, "node_modules/@types/http-assert": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz", - "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==", "dev": true }, "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, "node_modules/@types/inquirer": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.6.tgz", - "integrity": "sha512-1Go1AAP/yOy3Pth5Xf1DC3nfZ03cJLCPx6E2YnSN/5I3w1jHBVH4170DkZ+JxfmA7c9kL9+bf9z3FRGa4kNAqg==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", + "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", "dev": true, "dependencies": { "@types/through": "*", @@ -6820,47 +6106,47 @@ } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jquery": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", - "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.29.tgz", + "integrity": "sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==", "dependencies": { "@types/sizzle": "*" } }, "node_modules/@types/js-levenshtein": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz", - "integrity": "sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz", + "integrity": "sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -6870,15 +6156,15 @@ "dev": true }, "node_modules/@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", "dev": true }, "node_modules/@types/koa": { - "version": "2.13.6", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.6.tgz", - "integrity": "sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", "dev": true, "dependencies": { "@types/accepts": "*", @@ -6892,18 +6178,18 @@ } }, "node_modules/@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", "dev": true, "dependencies": { "@types/koa": "*" } }, "node_modules/@types/liftoff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.2.tgz", - "integrity": "sha512-X7Su8/zN7UgpA9nULCQwx9qy1RqcjUFmUVhj9kkjxXF5gIjZYC97lMRggyhV1/Y7M4rmEZ90jijAWVFWDVN//w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.3.tgz", + "integrity": "sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw==", "dev": true, "dependencies": { "@types/fined": "*", @@ -6911,39 +6197,39 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, "node_modules/@types/lodash-es": { - "version": "4.17.8", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.8.tgz", - "integrity": "sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==", + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "dev": true, "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/mdx": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.5.tgz", - "integrity": "sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.11.tgz", + "integrity": "sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==", "dev": true }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/@types/mime-types": { @@ -6953,27 +6239,30 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", "dev": true }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "dev": true }, "node_modules/@types/node": { - "version": "16.18.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", - "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", - "dev": true + "version": "20.11.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", + "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz", - "integrity": "sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", "dev": true, "dependencies": { "@types/node": "*", @@ -6999,27 +6288,27 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/@types/react": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.7.tgz", - "integrity": "sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==", + "version": "18.2.55", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", + "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -7034,21 +6323,21 @@ "dev": true }, "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -7056,37 +6345,38 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } }, "node_modules/@types/set-cookie-parser": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz", - "integrity": "sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.7.tgz", + "integrity": "sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/sinon": { - "version": "10.0.15", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", - "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", + "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinon-chai": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz", - "integrity": "sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz", + "integrity": "sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==", "dev": true, "dependencies": { "@types/chai": "*", @@ -7094,40 +6384,40 @@ } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", "dev": true }, "node_modules/@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", + "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==" }, "node_modules/@types/through": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.32.tgz", - "integrity": "sha512-7XsfXIsjdfJM2wFDRAtEWp3zb2aVPk5QeyZxGlVK57q4u26DczMHhJmlhr0Jqv0THwxam/L8REXkj8M2I/lcvw==", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/trusted-types": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/@types/uuid": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", - "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==" + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" }, "node_modules/@types/ws": { "version": "7.4.7", @@ -7164,16 +6454,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", - "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/type-utils": "6.14.0", - "@typescript-eslint/utils": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -7198,105 +6488,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", - "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7310,9 +6501,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7331,15 +6522,15 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", - "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -7358,124 +6549,17 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/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/@typescript-eslint/parser/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/@typescript-eslint/parser/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/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -7483,13 +6567,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", - "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/utils": "6.14.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -7509,145 +6593,13 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", - "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.14.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/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/@typescript-eslint/type-utils/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/@typescript-eslint/type-utils/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/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -7655,21 +6607,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -7694,9 +6647,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7715,29 +6668,28 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { @@ -7753,9 +6705,9 @@ } }, "node_modules/@typescript-eslint/utils/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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7774,16 +6726,16 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -7791,966 +6743,814 @@ } }, "node_modules/@umbraco-ui/uui": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.6.0-rc.3.tgz", - "integrity": "sha512-nOqoQ+U9X+oLWP62o3owXYuXQtVK8DRNpQsFPDkVjFtqsm/oKydt/PCQgEivwNptjOpA9Qea+8ZoPsg0FqEsNQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.6.2.tgz", + "integrity": "sha512-YX5/UuQPtdaiTKDyImNwcUf3am6Jaok8rTdJqDkURa8k/QLL9GHm7lUzgJftursNIyY+XGoO9b096pylf3G6MA==", "dependencies": { - "@umbraco-ui/uui-action-bar": "1.6.0-rc.3", - "@umbraco-ui/uui-avatar": "1.6.0-rc.3", - "@umbraco-ui/uui-avatar-group": "1.6.0-rc.3", - "@umbraco-ui/uui-badge": "1.6.0-rc.3", - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-boolean-input": "1.6.0-rc.3", - "@umbraco-ui/uui-box": "1.6.0-rc.3", - "@umbraco-ui/uui-breadcrumbs": "1.6.0-rc.3", - "@umbraco-ui/uui-button": "1.6.0-rc.3", - "@umbraco-ui/uui-button-group": "1.6.0-rc.3", - "@umbraco-ui/uui-button-inline-create": "1.6.0-rc.3", - "@umbraco-ui/uui-card": "1.6.0-rc.3", - "@umbraco-ui/uui-card-block-type": "1.6.0-rc.3", - "@umbraco-ui/uui-card-content-node": "1.6.0-rc.3", - "@umbraco-ui/uui-card-media": "1.6.0-rc.3", - "@umbraco-ui/uui-card-user": "1.6.0-rc.3", - "@umbraco-ui/uui-caret": "1.6.0-rc.3", - "@umbraco-ui/uui-checkbox": "1.6.0-rc.3", - "@umbraco-ui/uui-color-area": "1.6.0-rc.3", - "@umbraco-ui/uui-color-picker": "1.6.0-rc.3", - "@umbraco-ui/uui-color-slider": "1.6.0-rc.3", - "@umbraco-ui/uui-color-swatch": "1.6.0-rc.3", - "@umbraco-ui/uui-color-swatches": "1.6.0-rc.3", - "@umbraco-ui/uui-combobox": "1.6.0-rc.3", - "@umbraco-ui/uui-combobox-list": "1.6.0-rc.3", - "@umbraco-ui/uui-css": "1.6.0-rc.3", - "@umbraco-ui/uui-dialog": "1.6.0-rc.3", - "@umbraco-ui/uui-dialog-layout": "1.6.0-rc.3", - "@umbraco-ui/uui-file-dropzone": "1.6.0-rc.3", - "@umbraco-ui/uui-file-preview": "1.6.0-rc.3", - "@umbraco-ui/uui-form": "1.6.0-rc.3", - "@umbraco-ui/uui-form-layout-item": "1.6.0-rc.3", - "@umbraco-ui/uui-form-validation-message": "1.6.0-rc.3", - "@umbraco-ui/uui-icon": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry-essential": "1.6.0-rc.3", - "@umbraco-ui/uui-input": "1.6.0-rc.3", - "@umbraco-ui/uui-input-file": "1.6.0-rc.3", - "@umbraco-ui/uui-input-lock": "1.6.0-rc.3", - "@umbraco-ui/uui-input-password": "1.6.0-rc.3", - "@umbraco-ui/uui-keyboard-shortcut": "1.6.0-rc.3", - "@umbraco-ui/uui-label": "1.6.0-rc.3", - "@umbraco-ui/uui-loader": "1.6.0-rc.3", - "@umbraco-ui/uui-loader-bar": "1.6.0-rc.3", - "@umbraco-ui/uui-loader-circle": "1.6.0-rc.3", - "@umbraco-ui/uui-menu-item": "1.6.0-rc.3", - "@umbraco-ui/uui-modal": "1.6.0-rc.3", - "@umbraco-ui/uui-pagination": "1.6.0-rc.3", - "@umbraco-ui/uui-popover": "1.6.0-rc.3", - "@umbraco-ui/uui-popover-container": "1.6.0-rc.3", - "@umbraco-ui/uui-progress-bar": "1.6.0-rc.3", - "@umbraco-ui/uui-radio": "1.6.0-rc.3", - "@umbraco-ui/uui-range-slider": "1.6.0-rc.3", - "@umbraco-ui/uui-ref": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-list": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node-data-type": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node-document-type": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node-form": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node-member": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node-package": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node-user": "1.6.0-rc.3", - "@umbraco-ui/uui-scroll-container": "1.6.0-rc.3", - "@umbraco-ui/uui-select": "1.6.0-rc.3", - "@umbraco-ui/uui-slider": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-expand": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-file": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-file-dropzone": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-folder": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-lock": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-more": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-sort": "1.6.0-rc.3", - "@umbraco-ui/uui-table": "1.6.0-rc.3", - "@umbraco-ui/uui-tabs": "1.6.0-rc.3", - "@umbraco-ui/uui-tag": "1.6.0-rc.3", - "@umbraco-ui/uui-textarea": "1.6.0-rc.3", - "@umbraco-ui/uui-toast-notification": "1.6.0-rc.3", - "@umbraco-ui/uui-toast-notification-container": "1.6.0-rc.3", - "@umbraco-ui/uui-toast-notification-layout": "1.6.0-rc.3", - "@umbraco-ui/uui-toggle": "1.6.0-rc.3", - "@umbraco-ui/uui-visually-hidden": "1.6.0-rc.3" + "@umbraco-ui/uui-action-bar": "1.6.0", + "@umbraco-ui/uui-avatar": "1.6.0", + "@umbraco-ui/uui-avatar-group": "1.6.0", + "@umbraco-ui/uui-badge": "1.6.0", + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-boolean-input": "1.6.0", + "@umbraco-ui/uui-box": "1.6.2", + "@umbraco-ui/uui-breadcrumbs": "1.6.0", + "@umbraco-ui/uui-button": "1.6.0", + "@umbraco-ui/uui-button-group": "1.6.0", + "@umbraco-ui/uui-button-inline-create": "1.6.0", + "@umbraco-ui/uui-card": "1.6.0", + "@umbraco-ui/uui-card-block-type": "1.6.0", + "@umbraco-ui/uui-card-content-node": "1.6.0", + "@umbraco-ui/uui-card-media": "1.6.0", + "@umbraco-ui/uui-card-user": "1.6.0", + "@umbraco-ui/uui-caret": "1.6.0", + "@umbraco-ui/uui-checkbox": "1.6.0", + "@umbraco-ui/uui-color-area": "1.6.0", + "@umbraco-ui/uui-color-picker": "1.6.0", + "@umbraco-ui/uui-color-slider": "1.6.0", + "@umbraco-ui/uui-color-swatch": "1.6.0", + "@umbraco-ui/uui-color-swatches": "1.6.0", + "@umbraco-ui/uui-combobox": "1.6.0", + "@umbraco-ui/uui-combobox-list": "1.6.0", + "@umbraco-ui/uui-css": "1.6.0", + "@umbraco-ui/uui-dialog": "1.6.2", + "@umbraco-ui/uui-dialog-layout": "1.6.0", + "@umbraco-ui/uui-file-dropzone": "1.6.0", + "@umbraco-ui/uui-file-preview": "1.6.0", + "@umbraco-ui/uui-form": "1.6.0", + "@umbraco-ui/uui-form-layout-item": "1.6.0", + "@umbraco-ui/uui-form-validation-message": "1.6.0", + "@umbraco-ui/uui-icon": "1.6.0", + "@umbraco-ui/uui-icon-registry": "1.6.0", + "@umbraco-ui/uui-icon-registry-essential": "1.6.0", + "@umbraco-ui/uui-input": "1.6.0", + "@umbraco-ui/uui-input-file": "1.6.0", + "@umbraco-ui/uui-input-lock": "1.6.0", + "@umbraco-ui/uui-input-password": "1.6.0", + "@umbraco-ui/uui-keyboard-shortcut": "1.6.0", + "@umbraco-ui/uui-label": "1.6.0", + "@umbraco-ui/uui-loader": "1.6.0", + "@umbraco-ui/uui-loader-bar": "1.6.0", + "@umbraco-ui/uui-loader-circle": "1.6.0", + "@umbraco-ui/uui-menu-item": "1.6.0", + "@umbraco-ui/uui-modal": "1.6.0", + "@umbraco-ui/uui-pagination": "1.6.0", + "@umbraco-ui/uui-popover": "1.6.0", + "@umbraco-ui/uui-popover-container": "1.6.0", + "@umbraco-ui/uui-progress-bar": "1.6.0", + "@umbraco-ui/uui-radio": "1.6.0", + "@umbraco-ui/uui-range-slider": "1.6.0", + "@umbraco-ui/uui-ref": "1.6.0", + "@umbraco-ui/uui-ref-list": "1.6.0", + "@umbraco-ui/uui-ref-node": "1.6.0", + "@umbraco-ui/uui-ref-node-data-type": "1.6.0", + "@umbraco-ui/uui-ref-node-document-type": "1.6.0", + "@umbraco-ui/uui-ref-node-form": "1.6.0", + "@umbraco-ui/uui-ref-node-member": "1.6.0", + "@umbraco-ui/uui-ref-node-package": "1.6.0", + "@umbraco-ui/uui-ref-node-user": "1.6.0", + "@umbraco-ui/uui-scroll-container": "1.6.0", + "@umbraco-ui/uui-select": "1.6.0", + "@umbraco-ui/uui-slider": "1.6.0", + "@umbraco-ui/uui-symbol-expand": "1.6.0", + "@umbraco-ui/uui-symbol-file": "1.6.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.6.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.6.0", + "@umbraco-ui/uui-symbol-folder": "1.6.0", + "@umbraco-ui/uui-symbol-lock": "1.6.0", + "@umbraco-ui/uui-symbol-more": "1.6.0", + "@umbraco-ui/uui-symbol-sort": "1.6.0", + "@umbraco-ui/uui-table": "1.6.0", + "@umbraco-ui/uui-tabs": "1.6.1", + "@umbraco-ui/uui-tag": "1.6.0", + "@umbraco-ui/uui-textarea": "1.6.0", + "@umbraco-ui/uui-toast-notification": "1.6.2", + "@umbraco-ui/uui-toast-notification-container": "1.6.2", + "@umbraco-ui/uui-toast-notification-layout": "1.6.2", + "@umbraco-ui/uui-toggle": "1.6.0", + "@umbraco-ui/uui-visually-hidden": "1.6.0" } }, "node_modules/@umbraco-ui/uui-action-bar": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.6.0-rc.3.tgz", - "integrity": "sha512-8tTgTQ7Qekifi098cRVmoLpx9IrWdVbs2Egv7toAkaEkGx4e195YVNVYc1nXhO/wbbMLe2rx2r765rsUXkAelw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.6.0.tgz", + "integrity": "sha512-4O5wiRxbi3kW9fiRbBBdRIYyvH0fM+roQAP/e24Tctcr+L/JzUIcGjJsVpvDe0uy4ERX4MjUjWVpTT3Gw+sMow==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-button-group": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-button-group": "1.6.0" } }, "node_modules/@umbraco-ui/uui-avatar": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.6.0-rc.3.tgz", - "integrity": "sha512-iCSwVNCGk/I+febTD4Snvf5/kARawGJLkGR6Uy7WylEAvOhjWYdYg45d9kAjwQdEssCdKFy6DJ66NpDRxieneA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.6.0.tgz", + "integrity": "sha512-HOS9ksBuyRnIP+OM0gvGqyisfNzWEh1udb6KjTmlraco6OUw6D6CO9CYLT/SB34Tvqr59boIJROYxvcaCoC+Tg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-avatar-group": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.6.0-rc.3.tgz", - "integrity": "sha512-gG/nWjArhQxAos4hifh+NxZtobOQ7yu2CcEVzqlU+zRFm9ECp9DbrxrRIbhinJYSlWsz+89SrxyTaGOyC/mgQQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.6.0.tgz", + "integrity": "sha512-8X41hCoYac0/0tLNws1DtpNYvONdITVsoxPYWM4U/VmAAM/nERoNfYl11sx0f+s5Cq8QG4Bnmo7/DRZYPamPCA==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.6.0-rc.3", - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-avatar": "1.6.0", + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-badge": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.6.0-rc.3.tgz", - "integrity": "sha512-3Zrx14sg6gNC8reYq8e+xHBMJBqlsU9jhC7eNnsfdMJ55le+62UtWMcd9NtlAdD6d6f8lChEkRaSHHRSvVztnA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.6.0.tgz", + "integrity": "sha512-1yR817zW8/CQZUulXVfzvQp6eeh8j59j1SMjSAwk3EmJ1aEwgkl0DdpT1NNsb0aqrFzitzLwhjdFACPk4j/jhQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-base": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.6.0-rc.3.tgz", - "integrity": "sha512-7oFba1uLM0Rlcdb9Vt5fR2WvT0w8e6kWTBGfqqmX+0qxWKhh7DEr0UnTHLUnEjxWCQnv5k+lYSRjsIy/LPnHCA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.6.0.tgz", + "integrity": "sha512-+Z4/rSf4zo+SLN0xN0bjjrSBO0UJ2DSySnJbv43k104hB7/pailwIzgjF/4fWvF4RtDANxRq/MZWHApVWdSFhA==", "dependencies": { "lit": "^2.3.1" } }, - "node_modules/@umbraco-ui/uui-base/node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - } - }, - "node_modules/@umbraco-ui/uui-base/node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" - } - }, "node_modules/@umbraco-ui/uui-boolean-input": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.6.0-rc.3.tgz", - "integrity": "sha512-K+qQ3rSlNd0J9ax4Hs0d03c+w1Hf2V+BjdRLzgqn4quUwo0zTW+F5wgBKI3fYTKweIOh6MpWasvN8CewWj3w6g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.6.0.tgz", + "integrity": "sha512-xhumvCyKrH/BcprTuoIYH0HzDPgH5nCqZjBCxV42WacSDLKDno1jxbaGIiCYlDTDgjSayB6Hpn8pxaWAVd7t9g==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-box": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.6.0-rc.3.tgz", - "integrity": "sha512-XGEiKar1hzLDzRpU3c1eX6GmoUdB//4TGE1V1mIgnzUQm6FZTHTQx0t3BeGhveU9UN0d2yh4sFmR97+B9ZhXng==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.6.2.tgz", + "integrity": "sha512-NOmZLxbo5gga3xVCe1qjvIIoitNmUTcrKbI4zR65lOOuja0gdHD1ym6rOKpYBf0vYlbe11L8DZbGsiXDRZqJcg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-css": "1.4.0" - } - }, - "node_modules/@umbraco-ui/uui-box/node_modules/@umbraco-ui/uui-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0.tgz", - "integrity": "sha512-HBCFPuXJijeZbjnjdqmg3oqOGB3RmpQKT/s/Uy0TSJfaQGfz0e73o2eRghYHWF2rdqHw6brKFrZTZHBVvCE/xA==", - "dependencies": { - "lit": "^2.2.2" - } - }, - "node_modules/@umbraco-ui/uui-box/node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - } - }, - "node_modules/@umbraco-ui/uui-box/node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-css": "1.6.0" } }, "node_modules/@umbraco-ui/uui-breadcrumbs": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.6.0-rc.3.tgz", - "integrity": "sha512-ZA2+WwXPLErcvvlWrTXsKgWIrKBPZh57TIq2cFxVu46eGGobi8u7DLpvFETJFOVJWz3bLiFfPluf76vvkAfLPw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.6.0.tgz", + "integrity": "sha512-HDEooGvMkQAqndSm3SUT/kRY6nm4zzU2IqRcs8Qj8kY7Zfel/Uj+tE9nTRXyJE91POAkS0/iYrHw20rAY4wHFA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-button": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.6.0-rc.3.tgz", - "integrity": "sha512-0VEaOoQGPZYqSQG5seRx9bS5iXWINUNIKB3C02D9LhhSANkWXfpShC2TLqT7SWIdYvgTd24EFB4mda+UNCitPA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.6.0.tgz", + "integrity": "sha512-cSTQn2CjfUCE3Ft1I0kOSailuKD3NKxHD0HET8h7CJQbVr/R974vMNxLd82OWIwh/O+fyW4MUjKlw38T6W9o0A==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry-essential": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-icon-registry-essential": "1.6.0" } }, "node_modules/@umbraco-ui/uui-button-group": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.6.0-rc.3.tgz", - "integrity": "sha512-rp//K2LdGrTVi0dfgwy4SCCMdZkUoJZ6/I/wnRCDRcR9L6rSJmR14PQVcV3OCt4yY4rxBdVIzP8FUff46qDryg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.6.0.tgz", + "integrity": "sha512-ecuBV/+y9wn3lm2WaqgEOx6iB+m+351JwTGN0ZhQjGqH/0X2kSWeLIWbqa8JBXSvjKVyaxNwPZLuwV6QU3STkA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-button-inline-create": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.6.0-rc.3.tgz", - "integrity": "sha512-UJ2NA5AV1EDU/q2rT5kWWepln0xbUZfvAN3P492aB59cM+yfl8j6eWUZRak/+pf02BhCKdQn0nd+IQUqRYKCXA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.6.0.tgz", + "integrity": "sha512-rrsAFj48mELkVNeqL6bgUrfzs7QUuOxqFJo7Ffa6K+WDrqNNYQokO6YHjncU/J/lYDduFY/qhMyfgzYgZgDgWA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-card": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.6.0-rc.3.tgz", - "integrity": "sha512-U7Odx6mmS3gHa7eeWMPdwLUKy3nnqoAGK+ZREAKZvOcHOMklaHBRxcAXZfAuXD60saPJAGCeX4hPvQLbx5J2/g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.6.0.tgz", + "integrity": "sha512-v5NWiY3NOTaGQJt6zc/3rrLDy4gIileySwttGJD4+Fg8x5g2tS0igdiYZlqu6feieuTfw7HxUVvwK9mC81neAA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-card-block-type": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.6.0-rc.3.tgz", - "integrity": "sha512-9BbzD0uHLw1uqVth7lcDxlPiEFFDi/Rw4o1h27FosrV0satvKr4G3FKXlVbJm8ECOdsvkYaUzHTcHJK5tgmURw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.6.0.tgz", + "integrity": "sha512-2c4QV4PlmqwYYiTBDkyq2xDPrTh7U5iosZQNtEvNul6/+nbHitMlbC8KkbRz6D9K97iyEMHWifEeioA6uygBCA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-card": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-card": "1.6.0" } }, "node_modules/@umbraco-ui/uui-card-content-node": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.6.0-rc.3.tgz", - "integrity": "sha512-BEk+TsaFbohZCwjPEUlzqGrtGAAbM93j4yQPF2qH+5BrWHlSwCl5icwtDZjzSyM/X7GkZCOnLdEg/7Km+4GjoA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.6.0.tgz", + "integrity": "sha512-MiZz6Postf+1JE43+4IDrQEqiVhf76lkfWcdD2rb2sao+PzCL0DLiRWzvVZ4NoyOen/5tYgBHTQsBHDXYLtloQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-card": "1.6.0-rc.3", - "@umbraco-ui/uui-icon": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-card": "1.6.0", + "@umbraco-ui/uui-icon": "1.6.0" } }, "node_modules/@umbraco-ui/uui-card-media": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.6.0-rc.3.tgz", - "integrity": "sha512-rubexgXf/ocdGQ46yU3cFZVeNaTp6tuplDQwIAP8+KG4HMrdnsp/rP2udAKDey1/ecFtbWJT+Re1K/I4As1oxQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.6.0.tgz", + "integrity": "sha512-y569vkxLkkgAcjOVvh5AdGE+S49Oha/evKh9EPUcq0ZhZHiZ0JjHIHRDlGcviQq7co9ThCLXVzWjA8Mm+MlXdg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-card": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-file": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-folder": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-card": "1.6.0", + "@umbraco-ui/uui-symbol-file": "1.6.0", + "@umbraco-ui/uui-symbol-folder": "1.6.0" } }, "node_modules/@umbraco-ui/uui-card-user": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.6.0-rc.3.tgz", - "integrity": "sha512-a7xdnfTSUtVBDMhKdyiZULQi4gr15aGBCaAxN1ZNXOYDIxaOL3jrkq3VEskjKvgtUMSa4+jR/8wVePHJ55U0NQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.6.0.tgz", + "integrity": "sha512-4pNUmtzIXqalnU4rZ5qPPZ8PT8dwT/VaZTLHqzRMZ8v0FXK0qCks4E3qw7zm5xB9dWKsxxN2v9c/B8yeRavNmQ==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.6.0-rc.3", - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-card": "1.6.0-rc.3" + "@umbraco-ui/uui-avatar": "1.6.0", + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-card": "1.6.0" } }, "node_modules/@umbraco-ui/uui-caret": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.6.0-rc.3.tgz", - "integrity": "sha512-O1fbSI3FK8BfP/L9FVjUpC9ZJrUPM00+FYL0YXXQr2hsfp+EbwDbY9cD5Kwngk3+INzM+4vlKb56gf+i/hITKw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.6.0.tgz", + "integrity": "sha512-gwXtT0/R/Okgae+4t7ZP5QgEayIKhKPu7rMeUe6DcVi29o06vKsnmHubfAVva+E11DfO2tb1JDHDaV6h014LVA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-checkbox": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.6.0-rc.3.tgz", - "integrity": "sha512-LsiW20ZU4QAwZRuT6fEjEQxfWjbt4M7ZBI4152OrueyLgcFX060qVgWItLszGNPlrVYAVIHYNf2jdYF6JEfudA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.6.0.tgz", + "integrity": "sha512-5X/V3D+MrIul3D+sqaGgZmFNUflsMwH9NYfxrRcxV1juNkaoHXDf+AGJNB0VWwKrMwCzv64rf+bVyFaOkZ3kyg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-boolean-input": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry-essential": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-boolean-input": "1.6.0", + "@umbraco-ui/uui-icon-registry-essential": "1.6.0" } }, "node_modules/@umbraco-ui/uui-color-area": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.6.0-rc.3.tgz", - "integrity": "sha512-rlol64MAtE0DvXUaC4hXncwH9H7iMIpHu4BJVUnVOWz4esEo+TnaKRPqXKZfnE/ZJR40JafwkHBaA1bkXtQqnw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.6.0.tgz", + "integrity": "sha512-xeIiLx1NOOdGfAb195BydRAKMXcWzW1gfSdoHFGAty+5Vg1IVtVymg643wHgySYeaxfyJwQtB3PQscGRodrL3w==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", + "@umbraco-ui/uui-base": "1.6.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-picker": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.6.0-rc.3.tgz", - "integrity": "sha512-PFYWxzKUJPNCxI48rWzBs3KVJNATjuK9z1hjjSLCM8xUL79UoG2dnL6JZEgAqWQ28jIxcAMaCl2zQu/68NzR1Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.6.0.tgz", + "integrity": "sha512-kOgKAxT7b/OfUItDmU2zf67RZyl4hkzXn4oyGJln+5mCu3RCzD0fJnHE8pdna9lBBNTGeklgUm/OFgokmhIBDw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-popover-container": "1.6.0-rc.3", + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-popover-container": "1.6.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-slider": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.6.0-rc.3.tgz", - "integrity": "sha512-njepSEiDyxOsl20wIGMXJCBSbuYqcvHoLhZhLhL8SmGiw0oC9OFS7dDi1Kbhu0lyrhafHaFg2RxO42VpqkyG0g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.6.0.tgz", + "integrity": "sha512-D32sdaaw9v2V5su5DyyGI+lMc3UGUZkSNfh6SEAt9sHKzR/xIysdPu88DX4MsBAik/D1RxlgGIxGH5sqsePj5g==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-color-swatch": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.6.0-rc.3.tgz", - "integrity": "sha512-ThfJ4ygFp3JM2gb7oIjttOvI1yGgkksVgZvVPBKnPwQwmQp1bR6exnxRCdDOUL0n4bfT6DM/mrpE5LeQMIlSfw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.6.0.tgz", + "integrity": "sha512-8PRXImQ4gHFU7jU0azpN+z/ej9ad4lqQHpHn5mS7gzoKYcYY60k567JHQk3cBNbthrzHXrFxpNGC/TkLApGWhQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry-essential": "1.6.0-rc.3", + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-icon-registry-essential": "1.6.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-swatches": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.6.0-rc.3.tgz", - "integrity": "sha512-+J6VBf+amU9c2EiMPqSVmWcpZ9aKh9mQHOecgRlfcGlhDgT+H57krbM3Lz7ZBPHl4AIDQaSBO+ouxBAW2Q4B/g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.6.0.tgz", + "integrity": "sha512-M7acW/G0FskxDFU5B88KVMNmdso2rIbrl6vHk/bGZG7h1wElCDTseGRWGnGxVu4vHdvetLs6m5u7kjdXCqX3TA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-color-swatch": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-color-swatch": "1.6.0" } }, "node_modules/@umbraco-ui/uui-combobox": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.6.0-rc.3.tgz", - "integrity": "sha512-c3NUkUtr4IeZitZlmYkIbvkB4nPtiICAxgBkZTzfdjqLSjzB+LAFn0rIew9qq1k+2SI5ZwyD5vb7sYRKfP3oIA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.6.0.tgz", + "integrity": "sha512-AihlfdfUZ7+wY2fRKtlDIC5s018t+kEpkEXSqbsX/srRKt8SrHyrPROH4QNtzfqEjzWUGHdl+Jdqt1zP9ObLyA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-button": "1.6.0-rc.3", - "@umbraco-ui/uui-combobox-list": "1.6.0-rc.3", - "@umbraco-ui/uui-icon": "1.6.0-rc.3", - "@umbraco-ui/uui-popover-container": "1.6.0-rc.3", - "@umbraco-ui/uui-scroll-container": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-expand": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-button": "1.6.0", + "@umbraco-ui/uui-combobox-list": "1.6.0", + "@umbraco-ui/uui-icon": "1.6.0", + "@umbraco-ui/uui-popover-container": "1.6.0", + "@umbraco-ui/uui-scroll-container": "1.6.0", + "@umbraco-ui/uui-symbol-expand": "1.6.0" } }, "node_modules/@umbraco-ui/uui-combobox-list": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.6.0-rc.3.tgz", - "integrity": "sha512-5aCold3zI2hoZ/CK2hzS+kuGUdpmoUz9jf/93D4yBbz8GTf2wDxsmslUuhDnzJ8pIg22+osYT01k4R8lRpchOA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.6.0.tgz", + "integrity": "sha512-zBUbJ61OWgmKYF7I8gGj1fUh8d98js1mzVedzuzHDIfYJbuNB0Vgr+3GJ9rt2p0zRxYzEDO+dX+QSU6EDdnXLA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-css": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.6.0-rc.3.tgz", - "integrity": "sha512-9AxeLE+yHmDHagpB1sO++l5mHuj5iFi7dz+JwFG9UxXzII+wvCkpWSlgH55+fyh5eEGkyXqZWA50/ismUytw/A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.6.0.tgz", + "integrity": "sha512-mvepeDyrEixPQhTL39MPCzV+t1KZUEaYPdGfQVqNdf9qtH8YN2mXfDwanxMNDSvwDl+bl4A6hisGc4LYn6hL4w==", "dependencies": { "lit": "^2.2.2" } }, - "node_modules/@umbraco-ui/uui-css/node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - } - }, - "node_modules/@umbraco-ui/uui-css/node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" - } - }, "node_modules/@umbraco-ui/uui-dialog": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.6.0-rc.3.tgz", - "integrity": "sha512-oPVdMZt4TxgnTdeMApQz4qMGLDbF65mYQH2qhro+SU7379ftGNO9euv2SmZGDDKT8/1iI0nS8AuD8m1TBwZ+PQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.6.2.tgz", + "integrity": "sha512-D75CcXZU0YsHO0gsLqJqWCTLBSjNQQXMNJPIru9ilDPs/A5E+n1EjKVRetWJAmpPWn9it4bWaoZvH549vKesHA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-css": "1.4.0" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-css": "1.6.0" } }, "node_modules/@umbraco-ui/uui-dialog-layout": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.6.0-rc.3.tgz", - "integrity": "sha512-7rnywVNdShFHAWPkylQIieD2s2Vy53u/ZINCK2HuG0XmMDVxRbG9q3Tpn09vqOxGmI+4/SBO0UkJoq+yPNe+bA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.6.0.tgz", + "integrity": "sha512-nB4KrZ5qLZv3Kbn5KOtOUSdH6Y7fjjeD862N0kNOPA66f4mEA4XcJa6vyCxIK/fFv9e8mxCllJxtx3K3D8gEhQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" - } - }, - "node_modules/@umbraco-ui/uui-dialog/node_modules/@umbraco-ui/uui-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0.tgz", - "integrity": "sha512-HBCFPuXJijeZbjnjdqmg3oqOGB3RmpQKT/s/Uy0TSJfaQGfz0e73o2eRghYHWF2rdqHw6brKFrZTZHBVvCE/xA==", - "dependencies": { - "lit": "^2.2.2" - } - }, - "node_modules/@umbraco-ui/uui-dialog/node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - } - }, - "node_modules/@umbraco-ui/uui-dialog/node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-file-dropzone": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.6.0-rc.3.tgz", - "integrity": "sha512-clBeuuCTQmx2Jh2gApLBSHAfhRkdx1VZxRqvMlkjggcxIEVYc7joIRApOrL1Ea0u/vg9ZP3v3Wos4P5OQ4BTcA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.6.0.tgz", + "integrity": "sha512-CJhPinKKSMtGcjoaaPwR89tF9e1CM7GgzHxW44zwPiX/raQt1aMafRfqLG5zOWzwhkzb346HXy8n/ufhVRdzKQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-file-dropzone": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.6.0" } }, "node_modules/@umbraco-ui/uui-file-preview": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.6.0-rc.3.tgz", - "integrity": "sha512-sJv0qDdNFfc3koY38VO0NJYcSf5Ydoqq86I+4dzBZZYzXXsxkJlPdwgpLIwz/klJOqmwZLNZRl7IivqVRiIcMA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.6.0.tgz", + "integrity": "sha512-Wq7FGjYsXfPbuyNc9jDkf7wRm3G9ffX/pv3W69OVNCOwW1bWOfXg6ZrCA44wso1wfh4Bp3srBw93uBLe7SO0NQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-file": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-folder": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-symbol-file": "1.6.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.6.0", + "@umbraco-ui/uui-symbol-folder": "1.6.0" } }, "node_modules/@umbraco-ui/uui-form": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.6.0-rc.3.tgz", - "integrity": "sha512-NGx/pN98Iu301wXDA8Qh6liOA0AMmDKtfvcVNkbB33pq05IAkPKYZx2M6IbyFyxPPnoTuZfibRzforoS3943PQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.6.0.tgz", + "integrity": "sha512-KU1Y/ol3ltEsGMNDsUuC/QoaWs23QVboIY8qGRDElDF42n17XDq4Z59Y8Z7AKIxA9zhS8waJpZW2wjnkVAg5BQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-form-layout-item": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.6.0-rc.3.tgz", - "integrity": "sha512-x5jjkbGra1y5rALXO0LB6J359mj+6uvYqPgkyVzWwclPdTb4zmK/ysS3ZmzablGocrs3iw2g5oXWi3qS7s5FVA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.6.0.tgz", + "integrity": "sha512-raCu2MeJchmHXeb9GwIriRurR5zivG/3V89Vfo4pB06Qu64jf1fVNhDSGe/em8lzXjIZJfDe6k5/OnvvLBx6rg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-form-validation-message": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-form-validation-message": "1.6.0" } }, "node_modules/@umbraco-ui/uui-form-validation-message": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.6.0-rc.3.tgz", - "integrity": "sha512-Dk5WTy5uUmxOj85d381YJYYFMJJ4CAIq2N7Gww02xZ+hY/I2fg6KJMkx1E49SPqXCMSX4zFZKktjhZ54s11Law==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.6.0.tgz", + "integrity": "sha512-ghy+FusI2mFLKF/wMaZ0TtJqRKhrqnaBdB9Ae6c+Y7mN9Bs8mphTMyO7CNyLJkCenUiwqPu4Aof4N2aALcekwA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-icon": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.6.0-rc.3.tgz", - "integrity": "sha512-AMTV58MIjELlNe/BQPsvvjxrt8IARL0yHr6J9RobiUQ/AzkFWKdbTMHzYvt+qzYHfTeV8Cvgj7lej82Adlo34Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.6.0.tgz", + "integrity": "sha512-nlKs+ANdGMw4nOsdq1hXCZpiuE189ufm0dtmoTUvetDozeb7ghvsqjqR8eRz4UXI2jzPeHkK3nE1Gd93aE7AcA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-icon-registry": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.6.0-rc.3.tgz", - "integrity": "sha512-3HNv+Z2La1ijxvX03E8ICN/S1xvW3EQ4ln7ZFI3QVP5iCrcqXjbBGF3n+G0jjQpKkPqq0ZJOTltIba9wYLUPRw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.6.0.tgz", + "integrity": "sha512-oTwGsPxaG5eQInmwwf31FZWi9zawW+9YHjLPmGE+z8Chy+L+EaB0c1oABqVR2c/j5wlOnEiv06Itlz2uKXzILg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-icon": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-icon": "1.6.0" } }, "node_modules/@umbraco-ui/uui-icon-registry-essential": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.6.0-rc.3.tgz", - "integrity": "sha512-N2ZKpFRhwa+qud83ca3SV5OeIQ6mF0DpwhVGmX1ZdxObFLPrjz3Mh0oi+PhWqPXAG5c+4GPwAxYSJD8sHVR/RQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.6.0.tgz", + "integrity": "sha512-Fhoa2Ll1ZttdNnXHPj+87+Y/aFjb2CoTKWPLdLY22901Z23vB4fpJPaijP9osmC7wvorSPD+u9RmHZQom5zC0w==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-icon-registry": "1.6.0" } }, "node_modules/@umbraco-ui/uui-input": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.6.0-rc.3.tgz", - "integrity": "sha512-4EWPpzNi4HTex9uE7Rc2ePhinDwHPj0U1qThLsr7orbvnlS+v3eHNXQ+g8HwOApgRwvqr5yk5D/cxydQ77G2vQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.6.0.tgz", + "integrity": "sha512-eoJkK7DXVTNpdfJ1P6Epc/HieU9njjRk15xhUKAkwIZxAzMRPHq870hHvtbIzGfNPzHJ3OaI+qRLeIqusNfrdg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-input-file": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.6.0-rc.3.tgz", - "integrity": "sha512-YrFipURVGvEAGiIEX3zaaqDt5FGz5DLYyuydld5Mrbd0EJbxJDttosrtWor0XkmRStyOBycLxT8NK7FCuaCHBA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.6.0.tgz", + "integrity": "sha512-Lcgm46iQi8TBv3CVTd+5THcg3TLA9zj5wgbqgAS2ccu66ZGna4L7LLI7U1WaDN0CCtun3MlkgKh5xPXaayCvhA==", "dependencies": { - "@umbraco-ui/uui-action-bar": "1.6.0-rc.3", - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-button": "1.6.0-rc.3", - "@umbraco-ui/uui-file-dropzone": "1.6.0-rc.3", - "@umbraco-ui/uui-icon": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry-essential": "1.6.0-rc.3" + "@umbraco-ui/uui-action-bar": "1.6.0", + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-button": "1.6.0", + "@umbraco-ui/uui-file-dropzone": "1.6.0", + "@umbraco-ui/uui-icon": "1.6.0", + "@umbraco-ui/uui-icon-registry-essential": "1.6.0" } }, "node_modules/@umbraco-ui/uui-input-lock": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.6.0-rc.3.tgz", - "integrity": "sha512-5oIAOqwkJi6OXmh8laF/6+0zK76nXXSD/IiWMUauup7YUyu29Ocak8TUF+d5F8123aBjdcCvvzd7ExMXEpTAIQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.6.0.tgz", + "integrity": "sha512-PABZV0EoynQulo7rC9quXdEjgEtVM7tTCRlm6hx7cU0o6l6RvLJ4E6uoEDTpB1F4IocaZvPQsw7JvykCORAoxg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-button": "1.6.0-rc.3", - "@umbraco-ui/uui-icon": "1.6.0-rc.3", - "@umbraco-ui/uui-input": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-button": "1.6.0", + "@umbraco-ui/uui-icon": "1.6.0", + "@umbraco-ui/uui-input": "1.6.0" } }, "node_modules/@umbraco-ui/uui-input-password": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.6.0-rc.3.tgz", - "integrity": "sha512-2YOBq26v/d4DXsEY4BXjpQhzCtt5+5Rwp1n5wK4IL33hTvR4XbPHu0mFFFMFSjimc2QaWCz5niF9ihpBkJlqrg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.6.0.tgz", + "integrity": "sha512-y0YipO+8Sxkk80o17KDwYJ+ZD9BVLFzOkFNhAxqtkV2j7wJA3KgVLQu3gcOi52rpne/9way1a3kijtc0eWMomw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry-essential": "1.6.0-rc.3", - "@umbraco-ui/uui-input": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-icon-registry-essential": "1.6.0", + "@umbraco-ui/uui-input": "1.6.0" } }, "node_modules/@umbraco-ui/uui-keyboard-shortcut": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.6.0-rc.3.tgz", - "integrity": "sha512-trIbq4rceeXgoAeqj0ScQZ8vZWCTgecF6sWWkA53ThXbLBTk/C1GerrzO8KFHGgO9hVmsBwHmEk39+yD9sHmnQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.6.0.tgz", + "integrity": "sha512-ZDVNlrE19RNl2m7NA3CnNNWoWMOmm2iZMEhxy/3DSo4BcFQpknNrsc3IvDhZpXlFh5rA1+D9J+Zo3V7B3ZqSvQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-label": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.6.0-rc.3.tgz", - "integrity": "sha512-cudhsbX8wSnBWKoWZFpIbm56gHpRkXU4Q4egtxtjV2pLBnCN/GybqNn9wYqcgNc6lDKyvxXXSEFoOeA5ElQmQg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.6.0.tgz", + "integrity": "sha512-QU9MyxzwrvpRncZKUYbx4xMlD4TOmJA2XSAKkAyQpVOjJW79ZjzdQa2QfhVEHja/7FuUyQtVUMfBJ9rjjbp9GA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-loader": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.6.0-rc.3.tgz", - "integrity": "sha512-dRUBwZvybwUr/UdB5a7YqINICQxRrmToU7mlFutzUdzDSLMqJR6+nfML0iTncKwzPrk21NDbbxrvQkINN/g9ww==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.6.0.tgz", + "integrity": "sha512-Xlq8jfB5PPNw1F7Q14FkKJAvEi3uY5W3rGlRH73zcRC1gdaT7Uxqj29/eJ33kpwEgEl3c36psW+OYDceAVHZ+w==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-loader-bar": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.6.0-rc.3.tgz", - "integrity": "sha512-vJPzJnX2UUQNdhHZQGy1w4jR06FRuQnx4hhvJAt3/k9KFM4PqqJHeuTfuc0U4+du9mjvuR4gqEHvLauVdlX2Iw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.6.0.tgz", + "integrity": "sha512-yAcn8m6z675pRZLbBrQC9D18a+hSKGjr0EaGF4LzhwwuRO9ylVUtWnhat8CzhFUWxc4DbhblPwUrZC51BCYwXA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-loader-circle": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.6.0-rc.3.tgz", - "integrity": "sha512-FICgVN69gjSqK47RGJOA8oPwyD6BOF/Xm82P7OHxubWLG0T0SFJDQbNoD5p/44hsWxkQG0zRWt7uo+Uv4/14xA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.6.0.tgz", + "integrity": "sha512-00aK+OH1s1I4y5vzZ2o/TLHoIpk9tBsamgjAm4ZtwLNE2KCSalOwBnuh57vLta7so9fvI26KNwAV0ICpvIEx6Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-menu-item": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.6.0-rc.3.tgz", - "integrity": "sha512-krHWAaGIbSI8HmxpqpJGsSLL7GGvlLEqjdXoCXHVQ5S9F8FO3ylq14pYnZrxpHrE7bcwqzju9GjZCZiZWg4dyw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.6.0.tgz", + "integrity": "sha512-ffAlyqMyrMYr8uR9uEP0/vYAQYvC+5F2KHnEH5b8Li78qHG6R6+4m9lgAi+q+OUuM0AAtjQtmXM/7QFEmqEgvw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-loader-bar": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-expand": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-loader-bar": "1.6.0", + "@umbraco-ui/uui-symbol-expand": "1.6.0" } }, "node_modules/@umbraco-ui/uui-modal": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.6.0-rc.3.tgz", - "integrity": "sha512-HljQtu2JKHrwyuB79bS4WlfFh/egUttfHPplteI/LCSjQWncGOIy/ofXzst7HMGyfCGDHRxvOczGoYoqw0uMTw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.6.0.tgz", + "integrity": "sha512-coIJllr4kfzBOoc/2GKbLzyDJGcW3JMU1s/YgErVl7AnMOzeMWcc1SDhiL7LpntH3YJpKjswu7Ef0mBip2Toxw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-pagination": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.6.0-rc.3.tgz", - "integrity": "sha512-jSuEn5KCcsExlQ8sgG51lzGXruybuz/0gp4Y7pQxX7wwaRn43NxCQx4gLjZedleMDn2KLNV+DI+gnpx5jZMqiQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.6.0.tgz", + "integrity": "sha512-o9+nsZaDbuDRD8GblisjFRLl6rL978FDPP3Idgd08Sr+RMpObDYXayluCZo/aKxuiuFBFl59KnFWVfVp57mueg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-button": "1.6.0-rc.3", - "@umbraco-ui/uui-button-group": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-button": "1.6.0", + "@umbraco-ui/uui-button-group": "1.6.0" } }, "node_modules/@umbraco-ui/uui-popover": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.6.0-rc.3.tgz", - "integrity": "sha512-Q162ZlzGTAMvsNBzG4m0tCMkKhHMvEnosLnk9as0B1Q7WeiZ0TWDoY/a5clMZkj1EoctNC2FGfoNpSCV0niP7g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.6.0.tgz", + "integrity": "sha512-iqpgoOi7O4/GzHUzOAybaGrwAIBhtZjDKSwSw4sKzxs61ogsh009PlQiPp1VoLa8kCD7VWKaaF2nKbPsVJQtqQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-popover-container": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.6.0-rc.3.tgz", - "integrity": "sha512-PV111jFIu65DcTVboA4T5GKl3vNnH9VHLYgru0uJv5Nl/MGtKYsHG+C/9lGTxM4IxFvBq84pNHhGHZgBYGid9g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.6.0.tgz", + "integrity": "sha512-0SNxUdTsOH8WCIsl4MSgkoNdUO66BgO4Pkv5/o0p+NqSvsBoRdc/11lqCD9ghTTJ80TjEYFXTqaI8SrZu1Pmpg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-progress-bar": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.6.0-rc.3.tgz", - "integrity": "sha512-sJBo1QKn9OQK3Gc+tfMxgpmZSJn56scmEd137P5izCOyq5p8yBp2dIbT2P4VwnYxs4N3S5X55ZH1mzjNDWR5jw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.6.0.tgz", + "integrity": "sha512-dSa+WycxnQt3wvBxZONVjA7MtJ8/1r8Nzlh58xJytPLPpIbKKlpbU3GGf2is3zfJBun2mPn1F87EE2ZsBtsAXA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-radio": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.6.0-rc.3.tgz", - "integrity": "sha512-gcb43tYoOMvk9utMel7aqpe1lrzXIc8VcDnLpG1YSObfby/XV6HKDEGHF7vBg0mCpOj4u+CXuwsigFuvUUbl8g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.6.0.tgz", + "integrity": "sha512-rQpaCnL9T7kAtbNk4UwaZTDQvltw1louZYOKwrcDm06GvTar42B6VD8Oz5fBUrWXfjhzbv0eOxZTpO4+cHPojA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-range-slider": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.6.0-rc.3.tgz", - "integrity": "sha512-RRKZPPBtT44qLRH7N3y0duHfD24Lzuv01J/MMfFNdlzwyJL5n3+hJL1NuEmp7W/G1dCgujmJ2DaZPTcY/M5Yww==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.6.0.tgz", + "integrity": "sha512-kiz66NLoq4p7ITO7/bTXPvpfptVWjtYgjPoH9vR2xC/mVMrmkxYoMbbgBMYGmiAEn8iRO9P+eNEb80L4abONfA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.6.0-rc.3.tgz", - "integrity": "sha512-k2pnhlvOyxVJSvfsTqhfVvxLRbYsfQ2Ap5KvEoWKQMR1sNYYav0Fdl8bzJV8Okhlzl4O7iQhMiw4q2f6cmAMdg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.6.0.tgz", + "integrity": "sha512-/YakDo/4owjRcsprnkCcZTfF0blz1JqDOlLystte4rRdQxbf/Z9dTGD/dBHyf5AmkvXQtSAGMXMKintIGzK1dg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref-list": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.6.0-rc.3.tgz", - "integrity": "sha512-WF87gkCC8Uj1xof7uLpO9P1kBJ6HJDAhDd7JM4CvQrAqagdS9Wedlx9tgQV9ca+9z5B0jhUwYJEO2QfWCdngig==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.6.0.tgz", + "integrity": "sha512-DFwGyYhKLhMfTp3XGwmkYrgsdgj3TAqoODyQettrKZQG93h20hPyGcEGxPWg++RU/LdrvXv3YUbzeZP3LilHwA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref-node": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.6.0-rc.3.tgz", - "integrity": "sha512-oII0lxJMtDpTvT+buUuCtjN62k7SsY4xClcUnqy/hvDY1d59GNnIgLN2pz5Kpn/k+jsTfHp+zGNpjquhhvRWlg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.6.0.tgz", + "integrity": "sha512-J5VsIOLw9gvC27BpapCZ1x4xY6I+6HaZb1G6qrbNlCioqlMSLcBsicdeDxmFJTq/95NbXTqRdVnUtVBisL4Ovw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-icon": "1.6.0-rc.3", - "@umbraco-ui/uui-ref": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-icon": "1.6.0", + "@umbraco-ui/uui-ref": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref-node-data-type": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.6.0-rc.3.tgz", - "integrity": "sha512-OdzFdK10rkCaQS25ti7J7IBG+o7tGrtZoXj5I5nAqTf8UOFOTYKGjKzmmykOuAg7ViT7gWgi+OV5GqONhSTNzg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.6.0.tgz", + "integrity": "sha512-c7RFW8+4+j7PSVjEpvf1ZYDTBVDBKreNnxZas5CB50SkYUpZoSVx3iDrJEjUK4tMkcvv+f80lGwQ1DroC4oVOw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-ref-node": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref-node-document-type": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.6.0-rc.3.tgz", - "integrity": "sha512-93xgPScBCa07mTQC17v+kTX76BOgqcWS6eLW93eBQYQLGCRU6EWPt0rSPLg6Fb5gCVg3mdY5wHtsIvJapfthTg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.6.0.tgz", + "integrity": "sha512-96FC2X4SMPcaZUarFgKii9IrYSCmMRhiWMzySI2ILkLLz4rasfhQ5S5mTy80YecdY52ozaR55lEUwWXyBZcEIg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-ref-node": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref-node-form": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.6.0-rc.3.tgz", - "integrity": "sha512-lrjr+gOlEXavMbmw63TmcxbrxpdJUTVhhPETX3eVzc+kMLBsKi0wKlXKhY7AjaaqCDBCiz6M5IiSNaKg84GExw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.6.0.tgz", + "integrity": "sha512-wdnwu5I975FxcfXzHrxgn0JDCzHuhom47k4JeY4EeZ+dYkI9uQY4PgYqbWulhFzFoSNC3s03lAB5z9iIn5Dwfw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-ref-node": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref-node-member": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.6.0-rc.3.tgz", - "integrity": "sha512-dvXt1ldRcpY3NGiqe+u3J/+xQo85cW3cv9VEBxQIAt3ox5ndLsVhWdKCfRhbz+RWMj5IQ7szl/gEqm5QGj619g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.6.0.tgz", + "integrity": "sha512-PbvGbaMUl7H77psYwDNJdU50sdw/IQYFgnHvpoIAla9se0ZylmlkzU9PNBGOPWbba5fjINCwJ8sYLAWJ4ak1Rg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-ref-node": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref-node-package": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.6.0-rc.3.tgz", - "integrity": "sha512-92c0/zZrsoxXtW5MF+p9J+MjMQ7oZrYAayKFjEYCW91o8DECfFPM0lAXvbMJcCuDFMQJ5fcjlZz/ERA5s3exXQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.6.0.tgz", + "integrity": "sha512-f71HUf537F+OvQzdbKydtGKgAqrLSP92NwBfY/FUc9jQJP79IM5m6TWsq0LR62NsZokNH4FUwU8aWhQ5IbKgrA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-ref-node": "1.6.0" } }, "node_modules/@umbraco-ui/uui-ref-node-user": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.6.0-rc.3.tgz", - "integrity": "sha512-AyaMMYvtI2g91TuAe8aAjVVFHI0h3hPU6X8dGT/90ogDppiUBuQ++aVsK2HpmmkX2M8l+IF8JpBuxnfBhbJScQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.6.0.tgz", + "integrity": "sha512-J4gVUwzSX6AhKzny3JTeujV9w8PFL9ud/T564YajsK/FMurEMKskW1KWl4L9Oe0A1WYaxV50PJ8SutuZhC/d/w==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-ref-node": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-ref-node": "1.6.0" } }, "node_modules/@umbraco-ui/uui-scroll-container": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.6.0-rc.3.tgz", - "integrity": "sha512-R4T4ehbMpZEfDornwzyejk8i1UdeMfURe5PQn8EEhkAIX7u4roaTdb8cC7075WfC2qlkbRnrLHsFtPVF73yuyQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.6.0.tgz", + "integrity": "sha512-KuMRRJ3CfFXgES1pqSetExOqDrUGGVQkEY1rLJzd7rgAxS6ZU8A17xqQsLZ9PVPokcK1i27gsUHYDveT+swmlA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-select": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.6.0-rc.3.tgz", - "integrity": "sha512-BmwOcFUlpPrLN43C7/vTrMJhmzMFqzSgsUG5pqZfb0XS9egAZx4SondKcANubuLARIhTbRSCFuFkLgQTQ21kwA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.6.0.tgz", + "integrity": "sha512-HCXbMEMEumz0WJMgvjtMzxnGsLqMrsSN0dVJrw0UnF0ZAOYzTwyJuPv1QkritTfcNSLEi0/Kysn3e0mXybBDvA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-slider": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.6.0-rc.3.tgz", - "integrity": "sha512-E0MzOkw80/z4rQ0lc26kOTx+zFIz3TZz+5lQSjluS8TY+260CwhROBziGKkm9YAgH+9FIH4D8vArQtMoXJ5TYg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.6.0.tgz", + "integrity": "sha512-+zLW3FPBVmcfdT9Tbe/z6lFd1HTgE46Rlp72lJRvKDCtPJIkcsharLnpxDBn4A+dlXeuAvqRJoyqLa7LyPJXMw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-symbol-expand": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.6.0-rc.3.tgz", - "integrity": "sha512-Tqq0lmALnUJPgDo8HbFD5y9rUrcGQlPbURaqjJrhcz4WrpG/TAYwD0Dby7dBktIR0xzWse0kmz7Ib/SKKafMxA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.6.0.tgz", + "integrity": "sha512-tyotRdhTQjemaDqMMM3pdRvliFLaeRal34fTICAPtZT698LxeoK4Xt9EezB0rdeyOrvAVEuwv2b4PIsTe9YiXA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-symbol-file": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.6.0-rc.3.tgz", - "integrity": "sha512-R9ruwkQD951/SdBewahdPe/7zoBoGq6PoDY0JXPsvOCYnAaElkYkkj8sipsOO1EJj202FHJhlpVttZGdliKlpA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.6.0.tgz", + "integrity": "sha512-tlfMLbhRo1CAopt2MmX3E6Ej/l91NNBZ52BvPeAhf5UjthRkRnbrS4hArE1B2XDX5jm2olkfEY23aYl1GTYL5A==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-dropzone": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.6.0-rc.3.tgz", - "integrity": "sha512-HMXLzNowrwYC8iLBLsmhbUGIw2GFH/ko+0SH0B0lJyHIGiKgZa++WsTVVw7Egz2zUS6V3YbvvwbijoJoAM7vUA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.6.0.tgz", + "integrity": "sha512-NiZyMBP3Hjb6bU6DFnNEuyZC0Sdxd4eRq40/RhjSCFplGOD2701mBJukn10OhKVGRc7FmEIvW7he1curkVbDLQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.6.0-rc.3.tgz", - "integrity": "sha512-zRsByLRBaZq3fUKnVG5ynzy24ppOpyJ/kHTdi7p5pvFtJJ8qOYXkxqLF4AdgUlhdaZwjP50hIWo4+TIOghSVZA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.6.0.tgz", + "integrity": "sha512-1XEss/T/KWr+T9KBjWEDAMvyjJ3pTwiSYoLQ9AHjaYoLR8Ei+oiv6Set+usJ+rZ/FtsE3rYBVLbtBJe6zRHDEA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-symbol-folder": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.6.0-rc.3.tgz", - "integrity": "sha512-PF80tL4D8+PcCofBljaT/FR1lxP0bOZ5Lhtp5f/7jJmjqssVs9kSYy9YKhuCtB0GqEqML8FEK21XAIUM7ZAh+w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.6.0.tgz", + "integrity": "sha512-2slK864CuD1zcxU9OB8H2dDfmWzJC4hdesZ63/TnulH+DSZTZ/HLxmrNww9cqLOcuFCv4VNfamPdc7yMtzzjvQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-symbol-lock": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.6.0-rc.3.tgz", - "integrity": "sha512-X2Ebkuw//fjEd6ob2erd+L1hojpi9BvebzClEJVzJGR5nIHneZy3c/hwq2IPaeAJFQFyTIEKlGBrujvaFdxz+A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.6.0.tgz", + "integrity": "sha512-OC9niXXM43AuH7kzlxoR77vkE7Acy93t2bgy+GA6M1+HkyQksYLUM+cs0HeritcAw8pwxGcY3NU31fu+3nP7LQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-symbol-more": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.6.0-rc.3.tgz", - "integrity": "sha512-UkW8aP/gM6WAZ+L5mHzzDvaJNmE7RR3a/pU9vc/IxmKCzAqExIpACNBTE5e9TmzWwND6SwwswtxX/s9PsAnWEg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.6.0.tgz", + "integrity": "sha512-IM/FeymrKw4DEvEDxEJ26tC3Gsa/MLFI/cJeiZ9eOPwEuS3H5OhdB+jl2xZWWx0l+fo3acW4g2vr1UZ+bU+gJQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-symbol-sort": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.6.0-rc.3.tgz", - "integrity": "sha512-IKhGb4vgOSdhzHeRF76UWzPJ0g7jf/lKaMupKdTzs4UJbpICrsO6fiygzHLwl1XMNJtjXxOq8CYRGOxWxPkLjw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.6.0.tgz", + "integrity": "sha512-9niaAMqx/2CoY8D60xZs379pzWkcK4/LD4oWwBGy0ym+AFNon3Fc9sqRhLTucTqECwP7NMI6Jrxe3oohpYZ1uw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-table": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.6.0-rc.3.tgz", - "integrity": "sha512-ftB+4EyYtqtJ/SocbvyZgob3kWQvSi/3pk6X5zQwe4q8WSwR5UnF6zwt0AQIQsHxCCAgmXTBFl4RvCUtNksJ7w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.6.0.tgz", + "integrity": "sha512-D/LqbDEjVKP84+mIbTnnExpXeaL/pi+j77WnvH/sASYCQtiq5RufvzgC0lvBr8aS8hvdWv+mTV2hEt9b9GIlnA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-tabs": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.6.0-rc.3.tgz", - "integrity": "sha512-oNp8DjsUse285BicsSPSHqeKvPDJzcjjRXJr2U1ipwqYALSXldxaGBmhHe96NHhB0aJH2Ej1XT+fjU7lw8KJyQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.6.1.tgz", + "integrity": "sha512-LfV4LckIGwE9+JsjxLu0oXq93umDzngPht+7Mm8lqqHBl03R2GgogYmVvMklyaBbt0Uv0SuoIlh3tn1NVgAVxQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-button": "1.6.0-rc.3", - "@umbraco-ui/uui-popover-container": "1.6.0-rc.3", - "@umbraco-ui/uui-symbol-more": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-button": "1.6.0", + "@umbraco-ui/uui-popover-container": "1.6.0", + "@umbraco-ui/uui-symbol-more": "1.6.0" } }, "node_modules/@umbraco-ui/uui-tag": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.6.0-rc.3.tgz", - "integrity": "sha512-dsa+zakx9A4jkbU+H71UEM0fe8nAS1wr3mTm/iIyUZMtpfrWiWL8aF4fbhNHdg3bm3yV61OHAhXMpezqlrs5vQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.6.0.tgz", + "integrity": "sha512-k0NLdlu8QrQhyUQTZton3c8ELp1+HQBcF8T3LlDGE1eEItZIR6KzszBKBjCB8I4s2bjuXDPTv4FWE09s0vunJQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-textarea": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.6.0-rc.3.tgz", - "integrity": "sha512-AaWEW0C8dXaywap0PjQ+bgXqHXKdTDIjOxS+HjK9DnbvmuFkmYglUtsKNsNNR4ld9NBusvh7t+pupjcVdF9asw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.6.0.tgz", + "integrity": "sha512-VKCziqPPReeI6GAlrz/FQq+3pzN9boqUZ3jtg4PTRH04uDt9MCI2ZV/Y7lxNOcb214Q2EWsG/yJiiQgnI2R8Aw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@umbraco-ui/uui-toast-notification": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.6.0-rc.3.tgz", - "integrity": "sha512-2HmYxlpRxIJYd84mvF5RF+GVhVO0muVWUivSUyaOL8j5eK+dFH6W8UPrLaxODDRCz5ueLH+s6Dh+EpXmHLO6+g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.6.2.tgz", + "integrity": "sha512-L8ITXHwvLVE9CImpSATa9B9sZYFfOrW3dS/Jait4w1EWdTzgXjQprgQEcWNqJCM+7yTjnwJN47KCRr4moijfwQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-button": "1.6.0-rc.3", - "@umbraco-ui/uui-css": "1.4.0", - "@umbraco-ui/uui-icon": "1.6.0-rc.3", - "@umbraco-ui/uui-icon-registry-essential": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-button": "1.6.0", + "@umbraco-ui/uui-css": "1.6.0", + "@umbraco-ui/uui-icon": "1.6.0", + "@umbraco-ui/uui-icon-registry-essential": "1.6.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-container": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.6.0-rc.3.tgz", - "integrity": "sha512-2T8AeIwItjWz4w5FjhMe4j9zjPsbBGWNy4zOSi/PuAU1W6CEMEfyDPx1N1QH+5ub+gnviaT4q649VXbaYBhzHA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.6.2.tgz", + "integrity": "sha512-mmqN2vrnyZEi3Us+kEMAUbRCaQNN7qCmTe49mumCSg8C11nTAAiubAwJ8fBF0P8sK85Ntv5pdxJ2zDdjDR2LFA==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-toast-notification": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-toast-notification": "1.6.2" } }, "node_modules/@umbraco-ui/uui-toast-notification-layout": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.6.0-rc.3.tgz", - "integrity": "sha512-IrSQ0UeM0zI39EShmW2ya+3ljv0KfXMzPrkDnqPoZcnNRFR/gu6mhOLOmdJx1z71byyvE7koi4Ygatw6e6aUtQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.6.2.tgz", + "integrity": "sha512-h7VG+Jn7loxt51RB64DkSv146OLEmTkMsK38OPhGKFLcL35qEfPmRLNTFHFE6eI88vjfGow0vuHFJhcZUZBKYw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-css": "1.4.0" - } - }, - "node_modules/@umbraco-ui/uui-toast-notification-layout/node_modules/@umbraco-ui/uui-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0.tgz", - "integrity": "sha512-HBCFPuXJijeZbjnjdqmg3oqOGB3RmpQKT/s/Uy0TSJfaQGfz0e73o2eRghYHWF2rdqHw6brKFrZTZHBVvCE/xA==", - "dependencies": { - "lit": "^2.2.2" - } - }, - "node_modules/@umbraco-ui/uui-toast-notification-layout/node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - } - }, - "node_modules/@umbraco-ui/uui-toast-notification-layout/node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" - } - }, - "node_modules/@umbraco-ui/uui-toast-notification/node_modules/@umbraco-ui/uui-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0.tgz", - "integrity": "sha512-HBCFPuXJijeZbjnjdqmg3oqOGB3RmpQKT/s/Uy0TSJfaQGfz0e73o2eRghYHWF2rdqHw6brKFrZTZHBVvCE/xA==", - "dependencies": { - "lit": "^2.2.2" - } - }, - "node_modules/@umbraco-ui/uui-toast-notification/node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - } - }, - "node_modules/@umbraco-ui/uui-toast-notification/node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-css": "1.6.0" } }, "node_modules/@umbraco-ui/uui-toggle": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.6.0-rc.3.tgz", - "integrity": "sha512-UN5IRUjrLITaQjCAnPDg1is7hJva3RU6Hie1bjYVH/qDc21Ew6Rr2T+5E1D+AJDJjbm6ZAhpbxzAJiUqjJMfvg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.6.0.tgz", + "integrity": "sha512-uklbHJ6seRoqU6eGwnUiIPBiA7IN7xS/2PhYa3NGCzrLrB8bjv+lhIE95s/qHWKILjE7nVPkKIu5JWmDNeNBHg==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3", - "@umbraco-ui/uui-boolean-input": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0", + "@umbraco-ui/uui-boolean-input": "1.6.0" } }, "node_modules/@umbraco-ui/uui-visually-hidden": { - "version": "1.6.0-rc.3", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.6.0-rc.3.tgz", - "integrity": "sha512-P9e+aa4qndDdo2KYHJJCzFoTT/vo9tnD86G1d2rTsUfkoUvOXDQDwNvxVXJSbzL6lj6yWh6McM9Xk3oBAStwUg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.6.0.tgz", + "integrity": "sha512-MtoX8AjrH/+SsHrAi1IpMScVlDKvuKvn6szSE81Iif99vWzsf3QD3jP1ECFN2rf4E+fdwGukv3jVX9jrvQVnZw==", "dependencies": { - "@umbraco-ui/uui-base": "1.6.0-rc.3" + "@umbraco-ui/uui-base": "1.6.0" } }, "node_modules/@ungap/structured-clone": { @@ -8760,15 +7560,15 @@ "dev": true }, "node_modules/@web/browser-logs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.3.3.tgz", - "integrity": "sha512-wt8arj0x7ghXbnipgCvLR+xQ90cFg16ae23cFbInCrJvAxvyI22bAtT24W4XOXMPXwWLBVUJwBgBcXo3oKIvDw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.4.0.tgz", + "integrity": "sha512-/EBiDAUCJ2DzZhaFxTPRIznEPeafdLbXShIL6aTu7x73x7ZoxSDv7DGuTsh2rWNMUa4+AKli4UORrpyv6QBOiA==", "dev": true, "dependencies": { "errorstacks": "^2.2.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@web/config-loader": { @@ -8781,15 +7581,15 @@ } }, "node_modules/@web/dev-server": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.4.1.tgz", - "integrity": "sha512-GHeyH8MBZQpODFiHiXAdX4hOVbeDyD/DUermUinh/nexWAZUcXyXa200RItuAL6b25MQ3D/5hKNDypujSvXxiw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.4.2.tgz", + "integrity": "sha512-5IS2Rev+DRqIPtIiecOumoj+GZ4volRS6BeX+3mvuMF0OA51pCGhOozqUMVFFpAVuhHScihqIGk1gnHhw9d9kQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.11", "@types/command-line-args": "^5.0.0", "@web/config-loader": "^0.3.0", - "@web/dev-server-core": "^0.7.0", + "@web/dev-server-core": "^0.7.1", "@web/dev-server-rollup": "^0.6.1", "camelcase": "^6.2.0", "command-line-args": "^5.1.1", @@ -8810,14 +7610,14 @@ } }, "node_modules/@web/dev-server-core": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.5.2.tgz", - "integrity": "sha512-7YjWmwzM+K5fPvBCXldUIMTK4EnEufi1aWQWinQE81oW1CqzEwmyUNCtnWV9fcPA4kJC4qrpcjWNGF4YDWxuSg==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.1.tgz", + "integrity": "sha512-alHd2j0f4e1ekqYDR8lWScrzR7D5gfsUZq3BP3De9bkFWM3AELINCmqqlVKmCtlkAdEc9VyQvNiEqrxraOdc2A==", "dev": true, "dependencies": { "@types/koa": "^2.11.6", "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.0.0", + "@web/parse5-utils": "^2.1.0", "chokidar": "^3.4.3", "clone": "^2.1.2", "es-module-lexer": "^1.0.0", @@ -8835,13 +7635,13 @@ "ws": "^7.4.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@web/dev-server-core/node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, "node_modules/@web/dev-server-core/node_modules/lru-cache": { @@ -8875,14 +7675,15 @@ } }, "node_modules/@web/dev-server-esbuild": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-1.0.1.tgz", - "integrity": "sha512-EoLLFuv5Y47pqY1IJBcGZswzkqJd+/vN4BDI3oYq8p9dDE9EuQVkC7vweAUkH7vDzI7xUp+f0UzJeQcj9t7zNQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-1.0.2.tgz", + "integrity": "sha512-ak5mKt7L0H/Fa470Ku7p9A1eI32DNyFGM83jDkJviBO8r3lM00O5hVFW1K+UIYNC5EyanLyPxTqgtIuQEyMYcQ==", "dev": true, "dependencies": { "@mdn/browser-compat-data": "^4.0.0", "@web/dev-server-core": "^0.7.0", - "esbuild": "^0.19.5", + "esbuild": "^0.19.11", + "get-tsconfig": "^4.7.2", "parse5": "^6.0.1", "ua-parser-js": "^1.0.33" }, @@ -8890,69 +7691,394 @@ "node": ">=18.0.0" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=18.0.0" + "node": ">=12" } }, - "node_modules/@web/dev-server-esbuild/node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/@web/dev-server-esbuild/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=16.14" + "node": ">=12" } }, - "node_modules/@web/dev-server-esbuild/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8.3.0" + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/@web/dev-server-import-maps": { @@ -8972,71 +8098,6 @@ "node": ">=18.0.0" } }, - "node_modules/@web/dev-server-import-maps/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/dev-server-import-maps/node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/@web/dev-server-import-maps/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/dev-server-import-maps/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@web/dev-server-rollup": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.6.1.tgz", @@ -9054,142 +8115,12 @@ "node": ">=18.0.0" } }, - "node_modules/@web/dev-server-rollup/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/dev-server-rollup/node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", - "dev": true - }, - "node_modules/@web/dev-server-rollup/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/dev-server-rollup/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@web/dev-server/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/dev-server/node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, "node_modules/@web/dev-server/node_modules/ip": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", "dev": true }, - "node_modules/@web/dev-server/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/dev-server/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@web/parse5-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-2.1.0.tgz", @@ -9250,48 +8181,20 @@ "node": ">=18.0.0" } }, - "node_modules/@web/test-runner-chrome/node_modules/@web/browser-logs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.4.0.tgz", - "integrity": "sha512-/EBiDAUCJ2DzZhaFxTPRIznEPeafdLbXShIL6aTu7x73x7ZoxSDv7DGuTsh2rWNMUa4+AKli4UORrpyv6QBOiA==", + "node_modules/@web/test-runner-commands": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.9.0.tgz", + "integrity": "sha512-zeLI6QdH0jzzJMDV5O42Pd8WLJtYqovgdt0JdytgHc0d1EpzXDsc7NTCJSImboc2NcayIsWAvvGGeRF69SMMYg==", "dev": true, "dependencies": { - "errorstacks": "^2.2.0" + "@web/test-runner-core": "^0.13.0", + "mkdirp": "^1.0.4" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@web/test-runner-chrome/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-chrome/node_modules/@web/test-runner-core": { + "node_modules/@web/test-runner-core": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.13.0.tgz", "integrity": "sha512-mUrETPg9n4dHWEk+D46BU3xVhQf+ljT4cG7FSpmF7AIOsXWgWHoaXp6ReeVcEmM5fmznXec2O/apTb9hpGrP3w==", @@ -9328,110 +8231,6 @@ "node": ">=18.0.0" } }, - "node_modules/@web/test-runner-chrome/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@web/test-runner-chrome/node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/@web/test-runner-chrome/node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/@web/test-runner-chrome/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/test-runner-chrome/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@web/test-runner-commands": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.7.0.tgz", - "integrity": "sha512-3aXeGrkynOdJ5jgZu5ZslcWmWuPVY9/HNdWDUqPyNePG08PKmLV9Ij342ODDL6OVsxF5dvYn1312PhDqu5AQNw==", - "dev": true, - "dependencies": { - "@web/test-runner-core": "^0.11.0", - "mkdirp": "^1.0.4" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@web/test-runner-core": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.11.2.tgz", - "integrity": "sha512-7padi7pGg2xSW/i6iSApUwxlNaHv2bFBM+MiivkzJ0vet/a/+Fz35bOo8L8Ra7b/1my4VYBsPcWX0PVPowbXRg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^2.0.0", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.3.2", - "@web/dev-server-core": "^0.5.1", - "chokidar": "^3.4.3", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^2.0.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "ip": "^1.1.5", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "nanocolors": "^0.2.1", - "nanoid": "^3.1.25", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@web/test-runner-core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/@web/test-runner-core/node_modules/ip": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", @@ -9454,102 +8253,6 @@ "node": ">=18.0.0" } }, - "node_modules/@web/test-runner-coverage-v8/node_modules/@web/browser-logs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.4.0.tgz", - "integrity": "sha512-/EBiDAUCJ2DzZhaFxTPRIznEPeafdLbXShIL6aTu7x73x7ZoxSDv7DGuTsh2rWNMUa4+AKli4UORrpyv6QBOiA==", - "dev": true, - "dependencies": { - "errorstacks": "^2.2.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-coverage-v8/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-coverage-v8/node_modules/@web/test-runner-core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.13.0.tgz", - "integrity": "sha512-mUrETPg9n4dHWEk+D46BU3xVhQf+ljT4cG7FSpmF7AIOsXWgWHoaXp6ReeVcEmM5fmznXec2O/apTb9hpGrP3w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^2.0.0", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.4.0", - "@web/dev-server-core": "^0.7.0", - "chokidar": "^3.4.3", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^2.0.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "ip": "^1.1.5", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "nanocolors": "^0.2.1", - "nanoid": "^3.1.25", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-coverage-v8/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@web/test-runner-coverage-v8/node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/@web/test-runner-coverage-v8/node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, "node_modules/@web/test-runner-coverage-v8/node_modules/lru-cache": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", @@ -9559,27 +8262,6 @@ "node": ">=16.14" } }, - "node_modules/@web/test-runner-coverage-v8/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@web/test-runner-mocha": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@web/test-runner-mocha/-/test-runner-mocha-0.9.0.tgz", @@ -9592,132 +8274,6 @@ "node": ">=18.0.0" } }, - "node_modules/@web/test-runner-mocha/node_modules/@web/browser-logs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.4.0.tgz", - "integrity": "sha512-/EBiDAUCJ2DzZhaFxTPRIznEPeafdLbXShIL6aTu7x73x7ZoxSDv7DGuTsh2rWNMUa4+AKli4UORrpyv6QBOiA==", - "dev": true, - "dependencies": { - "errorstacks": "^2.2.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-mocha/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-mocha/node_modules/@web/test-runner-core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.13.0.tgz", - "integrity": "sha512-mUrETPg9n4dHWEk+D46BU3xVhQf+ljT4cG7FSpmF7AIOsXWgWHoaXp6ReeVcEmM5fmznXec2O/apTb9hpGrP3w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^2.0.0", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.4.0", - "@web/dev-server-core": "^0.7.0", - "chokidar": "^3.4.3", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^2.0.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "ip": "^1.1.5", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "nanocolors": "^0.2.1", - "nanoid": "^3.1.25", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-mocha/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@web/test-runner-mocha/node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/@web/test-runner-mocha/node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/@web/test-runner-mocha/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/test-runner-mocha/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@web/test-runner-playwright": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@web/test-runner-playwright/-/test-runner-playwright-0.11.0.tgz", @@ -9732,271 +8288,6 @@ "node": ">=18.0.0" } }, - "node_modules/@web/test-runner-playwright/node_modules/@web/browser-logs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.4.0.tgz", - "integrity": "sha512-/EBiDAUCJ2DzZhaFxTPRIznEPeafdLbXShIL6aTu7x73x7ZoxSDv7DGuTsh2rWNMUa4+AKli4UORrpyv6QBOiA==", - "dev": true, - "dependencies": { - "errorstacks": "^2.2.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-playwright/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-playwright/node_modules/@web/test-runner-core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.13.0.tgz", - "integrity": "sha512-mUrETPg9n4dHWEk+D46BU3xVhQf+ljT4cG7FSpmF7AIOsXWgWHoaXp6ReeVcEmM5fmznXec2O/apTb9hpGrP3w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^2.0.0", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.4.0", - "@web/dev-server-core": "^0.7.0", - "chokidar": "^3.4.3", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^2.0.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "ip": "^1.1.5", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "nanocolors": "^0.2.1", - "nanoid": "^3.1.25", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-playwright/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@web/test-runner-playwright/node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/@web/test-runner-playwright/node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/@web/test-runner-playwright/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/test-runner-playwright/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@web/test-runner/node_modules/@web/browser-logs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.4.0.tgz", - "integrity": "sha512-/EBiDAUCJ2DzZhaFxTPRIznEPeafdLbXShIL6aTu7x73x7ZoxSDv7DGuTsh2rWNMUa4+AKli4UORrpyv6QBOiA==", - "dev": true, - "dependencies": { - "errorstacks": "^2.2.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner/node_modules/@web/test-runner-commands": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.9.0.tgz", - "integrity": "sha512-zeLI6QdH0jzzJMDV5O42Pd8WLJtYqovgdt0JdytgHc0d1EpzXDsc7NTCJSImboc2NcayIsWAvvGGeRF69SMMYg==", - "dev": true, - "dependencies": { - "@web/test-runner-core": "^0.13.0", - "mkdirp": "^1.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner/node_modules/@web/test-runner-core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.13.0.tgz", - "integrity": "sha512-mUrETPg9n4dHWEk+D46BU3xVhQf+ljT4cG7FSpmF7AIOsXWgWHoaXp6ReeVcEmM5fmznXec2O/apTb9hpGrP3w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^2.0.0", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.4.0", - "@web/dev-server-core": "^0.7.0", - "chokidar": "^3.4.3", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^2.0.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "ip": "^1.1.5", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "nanocolors": "^0.2.1", - "nanoid": "^3.1.25", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@web/test-runner/node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/@web/test-runner/node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/@web/test-runner/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/test-runner/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -10080,9 +8371,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -10101,9 +8392,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -10131,16 +8422,19 @@ } }, "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ajv": { @@ -10320,12 +8614,12 @@ } }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/array-back": { @@ -10338,13 +8632,16 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10402,17 +8699,36 @@ "node": ">=8" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10458,17 +8774,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -10492,9 +8809,9 @@ } }, "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "dependencies": { "tslib": "^2.0.1" @@ -10539,9 +8856,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", "dev": true, "engines": { "node": ">= 0.4" @@ -10551,9 +8868,9 @@ } }, "node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.3.tgz", + "integrity": "sha512-d5ZQHPSPkF9Tw+yfyDcRoUOc4g/8UloJJe5J8m4L5+c7AtDdjDLRxew/knnI4CxvtdxEUVgWz4x3OIQUIFiMfw==", "dev": true, "engines": { "node": ">=4" @@ -10727,13 +9044,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", - "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.4", + "@babel/helper-define-polyfill-provider": "^0.5.0", "semver": "^6.3.1" }, "peerDependencies": { @@ -10741,25 +9058,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", - "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4" + "@babel/helper-define-polyfill-provider": "^0.5.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -10801,9 +9118,9 @@ ] }, "node_modules/basic-ftp": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", - "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", + "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -10898,6 +9215,36 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -10911,13 +9258,12 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -10948,9 +9294,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "dev": true, "funding": [ { @@ -10967,8 +9313,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -11062,14 +9408,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", + "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.3", + "set-function-length": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11113,9 +9463,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "version": "1.0.30001584", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001584.tgz", + "integrity": "sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==", "dev": true, "funding": [ { @@ -11382,12 +9732,30 @@ } }, "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-stack/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-cursor": { @@ -11403,9 +9771,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "engines": { "node": ">=6" @@ -11452,6 +9820,38 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -11592,9 +9992,9 @@ } }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { "node": ">=16" @@ -11699,6 +10099,15 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/consola": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", @@ -11761,9 +10170,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/cookie": { @@ -11782,9 +10191,9 @@ "dev": true }, "node_modules/cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, "dependencies": { "depd": "~2.0.0", @@ -11795,9 +10204,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", - "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", + "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", "dev": true, "dependencies": { "browserslist": "^4.22.2" @@ -11852,9 +10261,9 @@ } }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, "node_modules/data-uri-to-buffer": { @@ -11903,33 +10312,10 @@ } }, "node_modules/deep-equal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", - "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.1", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true }, "node_modules/deep-is": { "version": "0.1.4", @@ -11984,14 +10370,15 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", + "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -12007,11 +10394,12 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -12042,35 +10430,66 @@ "node": ">= 14" } }, - "node_modules/degenerator/node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/del": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", + "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", "dev": true, "dependencies": { - "tslib": "^2.0.1" + "globby": "^13.1.2", + "graceful-fs": "^4.2.10", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^5.5.0", + "rimraf": "^3.0.2", + "slash": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "node_modules/del/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12243,9 +10662,9 @@ "dev": true }, "node_modules/dompurify": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz", - "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.8.tgz", + "integrity": "sha512-b7uwreMYL2eZhrSCRC4ahLTeZcPZxSmYfmcQGXGkXiZSNW1X85v+SDM5KsWcpivIiUBH47Ji7NtyUdpLeF5JZQ==" }, "node_modules/dot-case": { "version": "3.0.4", @@ -12258,9 +10677,9 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", + "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", "dev": true, "engines": { "node": ">=12" @@ -12311,6 +10730,15 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -12339,20 +10767,20 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.614", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", - "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", + "version": "1.4.657", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.657.tgz", + "integrity": "sha512-On2ymeleg6QbRuDk7wNgDdXtNqlJLM2w4Agx1D/RiTmItiL+a9oq5p7HUa2ZtkAtGBe/kil2dq/7rPfkbe0r5w==", "dev": true }, "node_modules/element-internals-polyfill": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.3.9.tgz", - "integrity": "sha512-ti2fHL8rXbz5/pu50Nu45EXvORWtx1g1xWUQuZORkszbvCxosPEeHDeGzfvaaooXJNXNblogMP4atl680r9WyQ==" + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.3.10.tgz", + "integrity": "sha512-hflkht5sNZ2LF2sP9+OHfqGDcr8R9NIiDCuDfXep8uptqqt0OjZDaWJ/7ip+OdoIZBFJL+fFJ3+aLku1cTIEGA==" }, "node_modules/emoji-regex": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", - "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "node_modules/encodeurl": { @@ -12374,9 +10802,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -12399,9 +10827,9 @@ } }, "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -12420,9 +10848,9 @@ } }, "node_modules/errorstacks": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.4.0.tgz", - "integrity": "sha512-5ecWhU5gt0a5G05nmQcgCxP5HperSMxLDzvWlT5U+ZSKkuDK0rJ3dbCQny6/vSCIXjwrhwSecXBbw1alr295hQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.4.1.tgz", + "integrity": "sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==", "dev": true }, "node_modules/es-abstract": { @@ -12478,24 +10906,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, "node_modules/es-module-lexer": { @@ -12545,9 +10968,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -12557,28 +10980,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/esbuild-plugin-alias": { @@ -12600,9 +11023,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -12644,15 +11067,6 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12832,6 +11246,16 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -12853,6 +11277,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-lit": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.11.0.tgz", @@ -12871,9 +11307,9 @@ } }, "node_modules/eslint-plugin-lit-a11y": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-4.1.1.tgz", - "integrity": "sha512-PTUEwTMMtbZccrGQUPFfWI3Ope8oF8XEMLUckNbV0IvDTkEbXYlYlvNrkzI92gYKAVaVlNi2QZ/0n8Q3YiOBUg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-4.1.2.tgz", + "integrity": "sha512-otrF1Q0uv6RUz/AflVgnf1rVzbfQJfgUmnB+xBl71IR8EwtJGEOrqGs3Ky/4APMda+maF6bsZLctppcz16m7Hw==", "dev": true, "dependencies": { "aria-query": "^5.1.3", @@ -12937,6 +11373,161 @@ "lodash": "^4.17.15" } }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-storybook/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/eslint-plugin-storybook/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-storybook/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/eslint-plugin-wc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-2.0.4.tgz", @@ -12964,16 +11555,19 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -13009,6 +11603,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13037,31 +11641,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -13075,9 +11654,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -13110,6 +11689,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13176,15 +11767,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -13197,7 +11779,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -13206,15 +11788,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -13340,6 +11913,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -13428,9 +12016,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -13456,9 +12044,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -13525,6 +12113,20 @@ "ramda": "0.29.0" } }, + "node_modules/file-system-cache/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -13534,15 +12136,6 @@ "minimatch": "^5.0.1" } }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -13750,12 +12343,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -13763,24 +12357,24 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/flow-parser": { - "version": "0.226.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.226.0.tgz", - "integrity": "sha512-YlH+Y/P/5s0S7Vg14RwXlJMF/JsGfkG7gcKB/zljyoqaPNX9YVsGzx+g6MLTbhZaWbPhs4347aTpmSb9GgiPtw==", + "version": "0.228.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.228.0.tgz", + "integrity": "sha512-xPWkzCO07AnS8X+fQFpWm+tJ+C7aeaiVzJ+rSepbkCXUvUJ6l6squEl63axoMcixyH4wLjmypOzq/+zTD0O93w==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -13892,9 +12486,9 @@ "dev": true }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -13942,9 +12536,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -14009,17 +12603,33 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14076,13 +12686,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.1.tgz", + "integrity": "sha512-KmuibvwbWaM4BHcBRYwJfZ1JxyJeBwB8ct9YYu67SvYdbEIlcQ2e56dHxfbobqW38GXo8/zDFqJeGtHiVbWyQw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -14212,15 +12822,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/glob/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -14411,18 +13012,6 @@ "node": ">=0.10.0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -14442,12 +13031,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14478,12 +13067,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -14557,12 +13146,6 @@ "node": ">= 0.8" } }, - "node_modules/http-assert/node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true - }, "node_modules/http-assert/node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -14681,9 +13264,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -14724,18 +13307,21 @@ } }, "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inflation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", - "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", + "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -14764,9 +13350,9 @@ "dev": true }, "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -14783,7 +13369,7 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^6.0.1" }, "engines": { "node": ">=12.0.0" @@ -14842,13 +13428,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -14927,14 +13513,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15147,15 +13735,6 @@ "node": ">=8" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -15221,12 +13800,15 @@ } }, "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", "dev": true, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-path-inside": { @@ -15302,15 +13884,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -15366,12 +13939,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -15413,15 +13986,6 @@ "is-potential-custom-element-name": "^1.0.0" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -15434,19 +13998,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -15502,9 +14053,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -15577,9 +14128,9 @@ } }, "node_modules/istanbul-lib-report/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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -15610,9 +14161,9 @@ "dev": true }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -15673,6 +14224,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -15698,6 +14259,18 @@ "node": ">=8" } }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/jake/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -16000,6 +14573,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -16067,6 +14646,15 @@ "node": ">= 0.6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -16086,16 +14674,16 @@ } }, "node_modules/koa": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", - "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.0.tgz", + "integrity": "sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==", "dev": true, "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", "content-type": "^1.0.4", - "cookies": "~0.8.0", + "cookies": "~0.9.0", "debug": "^4.3.2", "delegates": "^1.0.0", "depd": "^2.0.0", @@ -16258,12 +14846,15 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.8.tgz", - "integrity": "sha512-aWAZwgPLS8hJ20lNPm9HNVs4inexz6S2sQa3wx/+ycuutMNE5/IfYxiWYBbi+9UWCQVaXYCOPUl6gFrPR7+jGg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/lazy-universal-dotenv": { @@ -16372,22 +14963,6 @@ "lit-html": "^3.1.2" } }, - "node_modules/lit-element/node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" - } - }, - "node_modules/lit-element/node_modules/lit-html": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", - "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, "node_modules/lit-html": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", @@ -16397,19 +14972,11 @@ } }, "node_modules/lit/node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" - } - }, - "node_modules/lit/node_modules/lit-html": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", - "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", - "dependencies": { - "@types/trusted-types": "^2.0.2" + "@lit-labs/ssr-dom-shim": "^1.0.0" } }, "node_modules/locate-path": { @@ -16554,35 +15121,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -16630,9 +15168,9 @@ "dev": true }, "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", + "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -16641,12 +15179,6 @@ "node": ">=12" } }, - "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -16715,9 +15247,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.0.tgz", - "integrity": "sha512-zilc+MIkVVXPyTb4iIUTIz9yyqfcWjszGXnwF9K/aiBWcHXFcmdEMTkG01/oQhwSCH7SY1BnG6+ev5BzWmbPrg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", + "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==", "dev": true, "engines": { "node": ">= 10" @@ -16727,9 +15259,9 @@ } }, "node_modules/marked": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.1.tgz", - "integrity": "sha512-EgxRjgK9axsQuUa/oKMx5DEY8oXpKJfk61rT5iY3aRlgU6QJtUcxU5OAymdhCvWvhYcd9FKmO5eQoX8m9VGJXg==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", + "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", "bin": { "marked": "bin/marked.js" }, @@ -16785,9 +15317,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz", - "integrity": "sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", @@ -17102,9 +15634,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.4.tgz", - "integrity": "sha512-WCssN+M9rUyfHN5zPBn3/f0mIA7tqArHL/EKbv3CZK+LT2rG77FEikIQEqBkv46fOqXQK4NEW/Pc7Z27gshpeg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", "dev": true, "dependencies": { "micromark-util-character": "^1.0.0", @@ -17118,9 +15650,9 @@ } }, "node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.0.tgz", - "integrity": "sha512-RWYce7j8+c0n7Djzv5NzGEGitNNYO3uj+h/XYMdS/JinH1Go+/Qkomg/rfxExFzYTiydaV6GLeffGO5qcJbMPA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", "dev": true, "dependencies": { "micromark-core-commonmark": "^1.0.0", @@ -17138,9 +15670,9 @@ } }, "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.5.tgz", - "integrity": "sha512-X0oI5eYYQVARhiNfbETy7BfLSmSilzN1eOuoRnrf9oUNsPRrWOAe9UqSizgw1vNxQBfOwL+n2610S3bYjVNi7w==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", "dev": true, "dependencies": { "micromark-util-chunked": "^1.0.0", @@ -17156,9 +15688,9 @@ } }, "node_modules/micromark-extension-gfm-table": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.6.tgz", - "integrity": "sha512-92pq7Q+T+4kXH4M6kL+pc8WU23Z9iuhcqmtYFWdFWjm73ZscFpH2xE28+XFpGWlvgq3LUwcN0XC0PGCicYFpgA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", "dev": true, "dependencies": { "micromark-factory-space": "^1.0.0", @@ -17186,9 +15718,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.4.tgz", - "integrity": "sha512-9XlIUUVnYXHsFF2HZ9jby4h3npfX10S1coXTnV035QGPgrtNYQq3J6IfIvcCIUAJrrqBVi5BqA/LmaOMJqPwMQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", "dev": true, "dependencies": { "micromark-factory-space": "^1.0.0", @@ -17629,15 +16161,18 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -17795,9 +16330,9 @@ } }, "node_modules/msw/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -17941,10 +16476,32 @@ "node": ">= 0.10.5" } }, + "node_modules/node-dir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-dir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -18019,37 +16576,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/node-plop/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-plop/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/node-plop/node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -18062,21 +16588,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/node-plop/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/node-plop/node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -18086,56 +16597,6 @@ "node": ">= 12" } }, - "node_modules/node-plop/node_modules/del": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", - "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", - "dev": true, - "dependencies": { - "globby": "^13.1.2", - "graceful-fs": "^4.2.10", - "is-glob": "^4.0.3", - "is-path-cwd": "^3.0.0", - "is-path-inside": "^4.0.0", - "p-map": "^5.5.0", - "rimraf": "^3.0.2", - "slash": "^4.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-plop/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-plop/node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/node-plop/node_modules/globby": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", @@ -18155,31 +16616,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-plop/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/node-plop/node_modules/inquirer": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", - "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.14.tgz", + "integrity": "sha512-4ByIMt677Iz5AvjyKrDpzaepIyMewNvDcvwpVVRZNmy9dLakVoVgdCHZXbK1SlVJra1db0JZ6XkJyHsanpdrdQ==", "dev": true, "dependencies": { - "@ljharb/through": "^2.3.9", + "@ljharb/through": "^2.3.12", "ansi-escapes": "^4.3.2", "chalk": "^5.3.0", "cli-cursor": "^3.1.0", "cli-width": "^4.1.0", "external-editor": "^3.1.0", - "figures": "^5.0.0", + "figures": "^3.2.0", "lodash": "^4.17.21", "mute-stream": "1.0.0", "ora": "^5.4.1", @@ -18190,43 +16639,7 @@ "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/node-plop/node_modules/is-path-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", - "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-plop/node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-plop/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, "node_modules/node-plop/node_modules/mkdirp": { @@ -18253,21 +16666,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/node-plop/node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/node-plop/node_modules/run-async": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", @@ -18289,20 +16687,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-plop/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -18352,14 +16736,14 @@ } }, "node_modules/nypm": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.4.tgz", - "integrity": "sha512-1JLkp/zHBrkS3pZ692IqOaIKSYHmQXgqfELk6YTOfVBnwealAmPA1q2kKK7PHJAHSMBozerThEFZXP3G6o7Ukg==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.6.tgz", + "integrity": "sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==", "dev": true, "dependencies": { "citty": "^0.1.5", "execa": "^8.0.1", - "pathe": "^1.1.1", + "pathe": "^1.1.2", "ufo": "^1.3.2" }, "bin": { @@ -18538,13 +16922,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -18588,15 +16972,16 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "node_modules/object.map": { @@ -18877,15 +17262,15 @@ } }, "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "aggregate-error": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19129,9 +17514,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -19153,9 +17538,9 @@ } }, "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, "node_modules/peek-stream": { @@ -19224,12 +17609,12 @@ } }, "node_modules/playwright": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", - "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz", + "integrity": "sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==", "dev": true, "dependencies": { - "playwright-core": "1.40.1" + "playwright-core": "1.41.2" }, "bin": { "playwright": "cli.js" @@ -19242,9 +17627,9 @@ } }, "node_modules/playwright-core": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", - "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz", + "integrity": "sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -19285,35 +17670,52 @@ "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/plimit-lit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.5.0.tgz", - "integrity": "sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", "dev": true, "dependencies": { - "queue-lit": "^1.5.0" + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" } }, "node_modules/plop": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plop/-/plop-4.0.0.tgz", - "integrity": "sha512-6hsuNofd5crnl7upQSRyw+7zVBZqxF9UZoWqsKqtPthpvtgUuYD+atBx7ZD9RT8qXWnylyCt9bpvYLZPexxDMg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/plop/-/plop-4.0.1.tgz", + "integrity": "sha512-5n8QU93kvL/ObOzBcPAB1siVFtAH1TZM6TntJ3JK5kXT0jIgnQV+j+uaOWWFJlg1cNkzLYm8klgASF65K36q9w==", "dev": true, "dependencies": { - "@types/liftoff": "^4.0.1", + "@types/liftoff": "^4.0.3", "chalk": "^5.3.0", "interpret": "^3.1.1", "liftoff": "^4.0.0", "minimist": "^1.2.8", "node-plop": "^0.32.0", - "ora": "^7.0.1", + "ora": "^8.0.0", "v8flags": "^4.0.1" }, "bin": { "plop": "bin/plop.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" } }, "node_modules/plop/node_modules/ansi-regex": { @@ -19368,6 +17770,34 @@ } }, "node_modules/plop/node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/plop/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/plop/node_modules/log-symbols/node_modules/is-unicode-supported": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", @@ -19379,40 +17809,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/plop/node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/plop/node_modules/ora": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", - "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", + "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", "dev": true, "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.0", + "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.3.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "string-width": "^6.1.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19435,17 +17849,17 @@ } }, "node_modules/plop/node_modules/string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19467,9 +17881,9 @@ } }, "node_modules/polished": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", - "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", "dev": true, "dependencies": { "@babel/runtime": "^7.17.8" @@ -19523,9 +17937,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.34.tgz", + "integrity": "sha512-4eLTO36woPSocqZ1zIrFD2K1v6wH7pY1uBh0JIM2KKfrVtGvPFiAku6aNOP0W1Wr9qwnaCsF0Z+CrVnryB2A8Q==", "dev": true, "funding": [ { @@ -19699,9 +18113,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -19732,10 +18146,31 @@ } } }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "dependencies": { "side-channel": "^1.0.4" @@ -19748,10 +18183,13 @@ } }, "node_modules/queue-lit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.0.tgz", - "integrity": "sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==", - "dev": true + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -19799,9 +18237,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -20071,6 +18509,18 @@ "node": ">= 4" } }, + "node_modules/recast/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/recast/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -20111,9 +18561,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, "node_modules/regenerator-transform": { @@ -20266,9 +18716,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -20409,6 +18859,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -20429,10 +18889,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/rollup": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.4.tgz", - "integrity": "sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -20445,26 +18917,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.4", - "@rollup/rollup-android-arm64": "4.9.4", - "@rollup/rollup-darwin-arm64": "4.9.4", - "@rollup/rollup-darwin-x64": "4.9.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.4", - "@rollup/rollup-linux-arm64-gnu": "4.9.4", - "@rollup/rollup-linux-arm64-musl": "4.9.4", - "@rollup/rollup-linux-riscv64-gnu": "4.9.4", - "@rollup/rollup-linux-x64-gnu": "4.9.4", - "@rollup/rollup-linux-x64-musl": "4.9.4", - "@rollup/rollup-win32-arm64-msvc": "4.9.4", - "@rollup/rollup-win32-ia32-msvc": "4.9.4", - "@rollup/rollup-win32-x64-msvc": "4.9.4", + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-esbuild": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.1.0.tgz", - "integrity": "sha512-HPpXU65V8bSpW8eSYPahtUJaJHmbxJGybuf/M8B3bz/6i11YaYHlNNJIQ38gSEV0FyohQOgVxJ2YMEEZtEmwvA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.1.1.tgz", + "integrity": "sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.5", @@ -20563,13 +19035,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -20587,15 +19059,18 @@ "dev": true }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -20625,9 +19100,9 @@ } }, "node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -20752,15 +19227,16 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dev": true, "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -20864,9 +19340,9 @@ } }, "node_modules/simple-update-notifier/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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -21037,9 +19513,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", + "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -21074,67 +19550,17 @@ } }, "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "dev": true, - "dependencies": { - "bl": "^5.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stdin-discarder/node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/stdin-discarder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/store2": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", @@ -21168,15 +19594,15 @@ } }, "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "dev": true }, "node_modules/streamx": { - "version": "2.15.5", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", - "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", + "version": "2.15.7", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.7.tgz", + "integrity": "sha512-NPEKS5+yjyo597eafGbKW5ujh7Sm6lDLHZQd/lRSz6S0VarpADBJItqfB4PnwpS+472oob1GX5cCY9vzfJpHUA==", "dev": true, "dependencies": { "fast-fifo": "^1.1.0", @@ -21190,14 +19616,34 @@ "dev": true }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -21446,9 +19892,9 @@ } }, "node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, "dependencies": { "b4a": "^1.6.4", @@ -21492,6 +19938,16 @@ "node": ">=8" } }, + "node_modules/temp/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/temp/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -21512,6 +19968,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/temp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/temp/node_modules/rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -21543,6 +20011,83 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tempy/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tempy/node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy/node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tempy/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", @@ -21569,6 +20114,16 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -21589,6 +20144,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -21632,6 +20199,15 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -21654,9 +20230,9 @@ "integrity": "sha512-Lho79o2Y1Yn+XdlTEkHTEkEmzwYWTXz7IUsvPwxJF3VTtgHUIAAuBab29kik+f2KED3rZvQavr9D7sHVMJ9x4A==" }, "node_modules/tinymce-i18n": { - "version": "23.12.4", - "resolved": "https://registry.npmjs.org/tinymce-i18n/-/tinymce-i18n-23.12.4.tgz", - "integrity": "sha512-EIbYrJBasx7T2iZxJ2jQT1xz0ET+PKi/Fzv6KPte0suu1MrCVBYw3Thsne1TCzPbcashajevmFX5z2wQlXqssQ==" + "version": "23.12.19", + "resolved": "https://registry.npmjs.org/tinymce-i18n/-/tinymce-i18n-23.12.19.tgz", + "integrity": "sha512-z73zjNgzNRgiJsO1g6sBHnp5pqLquVhaK+7+9aeZR5w5/kV36YxJAFbaN6qo/8TXwygPctkMnJTxiRR8n+ZYIQ==" }, "node_modules/title-case": { "version": "3.0.3", @@ -21734,9 +20310,9 @@ } }, "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, "funding": { "type": "github", @@ -21744,12 +20320,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.0.tgz", + "integrity": "sha512-d+3WxW4r8WQy2cZWpNRPPGExX8ffOLGcIhheUANKbL5Sqjbhkneki76fRAWeXkaslV2etTb4tSJBSxOsH5+CJw==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=18" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -21765,9 +20341,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -21849,18 +20425,18 @@ } }, "node_modules/tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.1.tgz", + "integrity": "sha512-7ppiBlF3UEddCLeI1JRx5m2Ryq+xk4JrZuq4EuYXykipebaq1dV0Fhgr1hb7CkmHt32QSgOZlcqVLEtHBG4/mg==", "dev": true, "bin": { "tsconfck": "bin/tsconfck.js" }, "engines": { - "node": "^14.13.1 || ^16 || >=18" + "node": "^18 || >=20" }, "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" + "typescript": "^5.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -21893,9 +20469,9 @@ } }, "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -22067,6 +20643,22 @@ "typescript-json-schema": "bin/typescript-json-schema" } }, + "node_modules/typescript-json-schema/node_modules/@types/node": { + "version": "16.18.79", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.79.tgz", + "integrity": "sha512-Qd7jdLR5zmnIyMhfDrfPqN5tUCvreVpP3Qrf2oSM+F7SNzlb/MwHISGUkdFHtevfkPJ3iAGyeQI/jsbh9EStgQ==", + "dev": true + }, + "node_modules/typescript-json-schema/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/typescript-json-schema/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -22087,6 +20679,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/typescript-json-schema/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/typescript-json-schema/node_modules/typescript": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", @@ -22110,9 +20714,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", - "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", "dev": true, "funding": [ { @@ -22122,6 +20726,10 @@ { "type": "paypal", "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } ], "engines": { @@ -22129,9 +20737,9 @@ } }, "node_modules/ufo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", - "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", "dev": true }, "node_modules/uglify-js": { @@ -22338,9 +20946,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -22356,12 +20964,12 @@ } }, "node_modules/unplugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.6.0.tgz", - "integrity": "sha512-BfJEpWBu3aE/AyHx8VaNE/WgouoQxgH9baAiH82JjX8cqVyi3uJQstqwD5J+SZxIK326SZIhsSZlALXVBCknTQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.7.1.tgz", + "integrity": "sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw==", "dev": true, "dependencies": { - "acorn": "^8.11.2", + "acorn": "^8.11.3", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.6.1" @@ -22563,14 +21171,14 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" @@ -22635,9 +21243,9 @@ } }, "node_modules/vite": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", - "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", "dev": true, "dependencies": { "esbuild": "^0.19.3", @@ -22690,9 +21298,9 @@ } }, "node_modules/vite-plugin-static-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.0.tgz", - "integrity": "sha512-kMlrB3WDtC5GzFedNIPkpjnOAr8M11PfWOiUaONrUZ3AqogTsOmIhTt6w7Fh311wl8pN81ld7sfuOEogFJ9N8A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.1.tgz", + "integrity": "sha512-3eGL4mdZoPJMDBT68pv/XKIHR4MgVolStIxxv1gIBP4R8TpHn9C9EnaU0hesqlseJ4ycLGUxckFTu/jpuJXQlA==", "dev": true, "dependencies": { "chokidar": "^3.5.3", @@ -22708,14 +21316,14 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.3.tgz", - "integrity": "sha512-xVsA2xe6QSlzBujtWF8q2NYexh7PAUYfzJ4C8Axpe/7d2pcERYxuxGgph9F4f0iQO36g5tyGq6eBUYIssdUrVw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz", + "integrity": "sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==", "dev": true, "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", - "tsconfck": "^2.1.0" + "tsconfck": "^3.0.1" }, "peerDependencies": { "vite": "*" @@ -22726,18 +21334,394 @@ } } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/walker": { @@ -22800,24 +21784,6 @@ "node": ">=14.17" } }, - "node_modules/web-component-analyzer/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/web-encoding": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", @@ -22898,32 +21864,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -22948,9 +21899,9 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -22958,10 +21909,7 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi-cjs": { @@ -23032,9 +21980,9 @@ } }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -23077,9 +22025,9 @@ "dev": true }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 8d2b4f59dc..b77b1bcaef 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -1,7 +1,7 @@ { "name": "@umbraco-cms/backoffice", "license": "MIT", - "version": "14.0.0--preview004", + "version": "14.0.0--preview005", "type": "module", "exports": { ".": null, @@ -31,7 +31,6 @@ "./extension-registry": "./dist-cms/packages/core/extension-registry/index.js", "./id": "./dist-cms/packages/core/id/index.js", "./localization": "./dist-cms/packages/core/localization/index.js", - "./macro": "./dist-cms/packages/core/macro/index.js", "./menu": "./dist-cms/packages/core/menu/index.js", "./modal": "./dist-cms/packages/core/modal/index.js", "./notification": "./dist-cms/packages/core/notification/index.js", @@ -46,7 +45,7 @@ "./tree": "./dist-cms/packages/core/tree/index.js", "./variant": "./dist-cms/packages/core/variant/index.js", "./workspace": "./dist-cms/packages/core/workspace/index.js", - "./events": "./dist-cms/packages/core/umb-events/index.js", + "./event": "./dist-cms/packages/core/event/index.js", "./repository": "./dist-cms/packages/core/repository/index.js", "./temporary-file": "./dist-cms/packages/core/temporary-file/index.js", "./block": "./dist-cms/packages/block/index.js", @@ -62,6 +61,7 @@ "./member-type": "./dist-cms/packages/members/member-types/index.js", "./package": "./dist-cms/packages/packages/package/index.js", "./data-type": "./dist-cms/packages/core/data-type/index.js", + "./dynamic-root": "./dist-cms/packages/dynamic-root/index.js", "./language": "./dist-cms/packages/settings/languages/index.js", "./logviewer": "./dist-cms/packages/settings/logviewer/index.js", "./relation-type": "./dist-cms/packages/relations/relation-types/index.js", @@ -139,9 +139,9 @@ "dependencies": { "@openid/appauth": "^1.3.1", "@types/dompurify": "^3.0.5", - "@types/uuid": "^9.0.7", - "@umbraco-ui/uui": "1.6.0-rc.3", - "@umbraco-ui/uui-css": "1.6.0-rc.3", + "@types/uuid": "^9.0.8", + "@umbraco-ui/uui": "1.6.2", + "@umbraco-ui/uui-css": "1.6.0", "dompurify": "^3.0.6", "element-internals-polyfill": "^1.3.9", "lit": "^3.1.2", @@ -157,7 +157,7 @@ "@babel/core": "^7.23.7", "@mdx-js/react": "^2.3.0", "@open-wc/testing": "^4.0.0", - "@playwright/test": "^1.40.1", + "@playwright/test": "^1.41.1", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", @@ -198,7 +198,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "remark-gfm": "^3.0.1", - "rollup": "^4.9.4", + "rollup": "^4.9.6", "rollup-plugin-esbuild": "^6.1.0", "rollup-plugin-import-css": "^3.4.0", "rollup-plugin-web-worker-loader": "^1.6.1", @@ -208,10 +208,14 @@ "typescript": "^5.3.3", "typescript-json-schema": "^0.62.0", "vite": "^5.0.11", - "vite-plugin-static-copy": "^1.0.0", + "vite-plugin-static-copy": "^1.0.1", "vite-tsconfig-paths": "^4.2.3", "web-component-analyzer": "^2.0.0" }, + "overrides": { + "lit": "$lit", + "lit-html": "2.8.0" + }, "msw": { "workerDirectory": "public" }, diff --git a/src/Umbraco.Web.UI.Client/public-assets/css/rte-content.css b/src/Umbraco.Web.UI.Client/public-assets/css/rte-content.css deleted file mode 100644 index 34ea2b3c77..0000000000 --- a/src/Umbraco.Web.UI.Client/public-assets/css/rte-content.css +++ /dev/null @@ -1,42 +0,0 @@ -.umb-macro-holder { - border: 3px dotted var(--uui-palette-spanish-pink-light); - padding: 7px; - display: block; - margin: 3px; -} - -.umb-macro-holder.loading { - background: url(assets/img/loader.gif) right no-repeat; - background-size: 18px; - background-position-x: 99%; -} - -.umb-embed-holder { - position: relative; -} - -.umb-embed-holder>* { - user-select: none; - pointer-events: none; -} - -.umb-embed-holder[data-mce-selected] { - outline: 2px solid var(--uui-palette-spanish-pink-light); -} - -.umb-embed-holder::before { - z-index: 1000; - width: 100%; - height: 100%; - position: absolute; - content: ' '; -} - -.umb-embed-holder[data-mce-selected]::before { - background: rgba(0, 0, 0, 0.025); -} - -*[data-mce-selected='inline-boundary'] { - background: rgba(0, 0, 0, 0.025); - outline: 2px solid var(--uui-palette-spanish-pink-light); -} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.context.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.context.ts index d89f99bf25..ed00430c48 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.context.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.context.ts @@ -1,6 +1,6 @@ -import { UmbAppContextConfig } from './app-context-config.interface.js'; +import type { UmbAppContextConfig } from './app-context-config.interface.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbAppContext extends UmbBaseController { diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 745e057c76..88aa57b3ef 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -1,7 +1,8 @@ import type { UmbAppErrorElement } from './app-error.element.js'; import { UmbAppContext } from './app.context.js'; import { UmbServerConnection } from './server-connection.js'; -import { UMB_AUTH_CONTEXT, UmbAuthContext } from '@umbraco-cms/backoffice/auth'; +import type { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; +import { UMB_STORAGE_REDIRECT_URL, UmbAuthContext } from '@umbraco-cms/backoffice/auth'; import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UUIIconRegistryEssential } from '@umbraco-cms/backoffice/external/uui'; import { UmbIconRegistry } from '@umbraco-cms/backoffice/icon'; @@ -28,13 +29,12 @@ export class UmbAppElement extends UmbLitElement { * @attr */ @property({ type: String }) - // TODO: get from server config + // TODO: get from base element or maybe move to UmbAuthContext.#getRedirectUrl since it is only used there backofficePath = '/umbraco'; /** * Bypass authentication. */ - // TODO: this might not be the right solution @property({ type: Boolean }) bypassAuth = false; @@ -77,8 +77,8 @@ export class UmbAppElement extends UmbLitElement { async #setup() { if (this.serverUrl === undefined) throw new Error('No serverUrl provided'); - /* All requests to the server requires the base URL to be set. - We make sure it happens before we get the server status. + /* All requests to the server requires the base URL to be set. + We make sure it happens before we get the server status. TODO: find the right place to set this */ OpenAPI.BASE = this.serverUrl; @@ -93,7 +93,7 @@ export class UmbAppElement extends UmbLitElement { // If the runtime level is "install" we should clear any cached tokens // else we should try and set the auth status if (this.#serverConnection.getStatus() === RuntimeLevelModel.INSTALL) { - await this.#authContext.signOut(); + await this.#authContext.clearTokenStorage(); } else { await this.#setAuthStatus(); } @@ -136,9 +136,19 @@ export class UmbAppElement extends UmbLitElement { // Instruct all requests to use the auth flow to get and use the access_token for all subsequent requests OpenAPI.TOKEN = () => this.#authContext!.getLatestToken(); OpenAPI.WITH_CREDENTIALS = true; + OpenAPI.CREDENTIALS = 'include'; } #redirect() { + // If there is a ?code parameter in the url, then we are in the middle of the oauth flow + // and we need to complete the login (the authorization notifier will redirect after this is done + // essentially hitting this method again) + const queryParams = new URLSearchParams(window.location.search); + if (queryParams.has('code')) { + this.#authContext?.completeAuthorizationRequest(); + return; + } + switch (this.#serverConnection?.getStatus()) { case RuntimeLevelModel.INSTALL: history.replaceState(null, '', 'install'); @@ -155,17 +165,15 @@ export class UmbAppElement extends UmbLitElement { case RuntimeLevelModel.RUN: { const pathname = pathWithoutBasePath({ start: true, end: false }); - // If we are on the installer or upgrade page, redirect to the root - // but if not, keep the current path but replace state anyway to initialize the router - let currentRoute = location.href; - const savedRoute = sessionStorage.getItem('umb:auth:redirect'); - if (savedRoute) { - sessionStorage.removeItem('umb:auth:redirect'); - currentRoute = savedRoute; + // If we are on installer or upgrade page, redirect to the root since we are in the RUN state + if (pathname === '/install' || pathname === '/upgrade') { + history.replaceState(null, '', '/'); + break; } - const finalPath = pathname === '/install' || pathname === '/upgrade' ? '/' : currentRoute; - history.replaceState(null, '', finalPath); + // Keep the current path but replace state anyway to initialize the router + // because the router will not initialize a wildcard route by itself + history.replaceState(null, '', location.href); break; } @@ -186,11 +194,10 @@ export class UmbAppElement extends UmbLitElement { } // Save location.href so we can redirect to it after login - window.sessionStorage.setItem('umb:auth:redirect', location.href); + window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); // Make a request to the auth server to start the auth flow - // TODO: find better name for this method - this.#authContext.login(); + this.#authContext.makeAuthorizationRequest(); // Return false to prevent the route from being rendered return false; diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/server-connection.ts b/src/Umbraco.Web.UI.Client/src/apps/app/server-connection.ts index 5655be20f2..fbabfa9b7b 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/server-connection.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/server-connection.ts @@ -56,7 +56,7 @@ export class UmbServerConnection { throw error; } - this.#isConnected.next(true); + this.#isConnected.setValue(true); this.#status = data?.serverStatus ?? RuntimeLevelModel.UNKNOWN; } } diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts index ca1f0d8079..6d6de92b73 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts @@ -5,7 +5,7 @@ import { UmbExtensionsManifestInitializer, } from '@umbraco-cms/backoffice/extension-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { type ManifestSection, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; export class UmbBackofficeContext extends UmbContextBase { @@ -17,15 +17,15 @@ export class UmbBackofficeContext extends UmbContextBase { public readonly allowedSections = this.#allowedSections.asObservable(); constructor(host: UmbControllerHost) { - super(host, UMB_BACKOFFICE_CONTEXT_TOKEN); + super(host, UMB_BACKOFFICE_CONTEXT); new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'section', null, (sections) => { - this.#allowedSections.next([...sections]); + this.#allowedSections.setValue([...sections]); }); } public setActiveSectionAlias(alias: string) { - this.#activeSectionAlias.next(alias); + this.#activeSectionAlias.setValue(alias); } } -export const UMB_BACKOFFICE_CONTEXT_TOKEN = new UmbContextToken('UmbBackofficeContext'); +export const UMB_BACKOFFICE_CONTEXT = new UmbContextToken('UmbBackofficeContext'); diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts index 84243dafc2..997f5a79fa 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts @@ -30,6 +30,7 @@ const CORE_PACKAGES = [ import('../../packages/log-viewer/umbraco-package.js'), import('../../packages/health-check/umbraco-package.js'), import('../../packages/static-file/umbraco-package.js'), + import('../../packages/dynamic-root/umbraco-package.js'), ]; @customElement('umb-backoffice') diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.stories.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.stories.ts index 480b8cb7eb..670e5afc46 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbBackofficeElement } from './backoffice.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-apps.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-apps.element.ts index 248f0b1da1..456199851a 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-apps.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-apps.element.ts @@ -1,4 +1,5 @@ -import { css, CSSResultGroup, html, LitElement, customElement } from '@umbraco-cms/backoffice/external/lit'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, LitElement, customElement } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-backoffice-header-apps') export class UmbBackofficeHeaderAppsElement extends LitElement { diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-sections.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-sections.element.ts index c2c7c77ce8..659a79fbaa 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-sections.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header-sections.element.ts @@ -1,9 +1,10 @@ -import { UMB_BACKOFFICE_CONTEXT_TOKEN } from '../backoffice.context.js'; +import { UMB_BACKOFFICE_CONTEXT } from '../backoffice.context.js'; import type { UmbBackofficeContext } from '../backoffice.context.js'; -import { css, CSSResultGroup, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import type { ManifestSection } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbExtensionManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbExtensionManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; @customElement('umb-backoffice-header-sections') export class UmbBackofficeHeaderSectionsElement extends UmbLitElement { @@ -18,7 +19,7 @@ export class UmbBackofficeHeaderSectionsElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_BACKOFFICE_CONTEXT_TOKEN, (backofficeContext) => { + this.consumeContext(UMB_BACKOFFICE_CONTEXT, (backofficeContext) => { this._backofficeContext = backofficeContext; this._observeSections(); this._observeCurrentSection(); diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header.element.ts index d8f77e99ce..3061130528 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-header.element.ts @@ -1,4 +1,5 @@ -import { css, CSSResultGroup, html, customElement } from '@umbraco-cms/backoffice/external/lit'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-backoffice-header') diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts index 8cd338830b..e4f01ee751 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/components/backoffice-main.element.ts @@ -1,9 +1,11 @@ -import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from '../backoffice.context.js'; +import type { UmbBackofficeContext} from '../backoffice.context.js'; +import { UMB_BACKOFFICE_CONTEXT } from '../backoffice.context.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbSectionContext, UMB_SECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/section'; +import { UmbSectionContext, UMB_SECTION_CONTEXT } from '@umbraco-cms/backoffice/section'; import type { UmbRoute, UmbRouterSlotChangeEvent } from '@umbraco-cms/backoffice/router'; import type { ManifestSection, UmbSectionElement } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbExtensionManifestInitializer, createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbExtensionManifestInitializer} from '@umbraco-cms/backoffice/extension-api'; +import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-backoffice-main') @@ -21,7 +23,7 @@ export class UmbBackofficeMainElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_BACKOFFICE_CONTEXT_TOKEN, (_instance) => { + this.consumeContext(UMB_BACKOFFICE_CONTEXT, (_instance) => { this._backofficeContext = _instance; this._observeBackoffice(); }); @@ -88,7 +90,7 @@ export class UmbBackofficeMainElement extends UmbLitElement { private _provideSectionContext(sectionManifest: ManifestSection) { if (!this._sectionContext) { this._sectionContext = new UmbSectionContext(sectionManifest); - this.provideContext(UMB_SECTION_CONTEXT_TOKEN, this._sectionContext); + this.provideContext(UMB_SECTION_CONTEXT, this._sectionContext); } else { this._sectionContext.setManifest(sectionManifest); } diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts index 742340f313..da091c418f 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts @@ -1,9 +1,10 @@ import { PackageResource, OpenAPI } from '@umbraco-cms/backoffice/backend-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { ManifestBase, isManifestBaseType } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestBase} from '@umbraco-cms/backoffice/extension-api'; +import { isManifestBaseType } from '@umbraco-cms/backoffice/extension-api'; // TODO: consider if this can be replaced by the new extension controllers export class UmbServerExtensionRegistrator extends UmbBaseController { diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.element.ts index 5d81d1b77b..d5ab966a35 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.element.ts @@ -1,9 +1,12 @@ -import { UmbInstallerContext, UMB_INSTALLER_CONTEXT_TOKEN } from '../installer.context.js'; -import { css, CSSResultGroup, html, customElement, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbInstallerContext} from '../installer.context.js'; +import { UMB_INSTALLER_CONTEXT } from '../installer.context.js'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit'; -import { +import type { ConsentLevelPresentationModel, - TelemetryResponseModel, + TelemetryResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { TelemetryLevelModel, } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -21,7 +24,7 @@ export class UmbInstallerConsentElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_INSTALLER_CONTEXT_TOKEN, (installerContext) => { + this.consumeContext(UMB_INSTALLER_CONTEXT, (installerContext) => { this._installerContext = installerContext; this._observeInstallerSettings(); this._observeInstallerData(); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.stories.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.stories.ts index 4ef5d96528..27786374b3 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import { installerContextProvider } from '../shared/utils.story-helpers.js'; import type { UmbInstallerConsentElement } from './installer-consent.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.element.ts index ca5e80163d..df4993346f 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.element.ts @@ -1,8 +1,10 @@ -import { UmbInstallerContext, UMB_INSTALLER_CONTEXT_TOKEN } from '../installer.context.js'; -import { UUIButtonElement } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbInstallerContext} from '../installer.context.js'; +import { UMB_INSTALLER_CONTEXT } from '../installer.context.js'; +import type { UUIButtonElement } from '@umbraco-cms/backoffice/external/uui'; +import type { + CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; import { css, - CSSResultGroup, html, nothing, customElement, @@ -11,12 +13,13 @@ import { state, } from '@umbraco-cms/backoffice/external/lit'; -import { - ApiError, +import type { DatabaseInstallResponseModel, DatabaseSettingsPresentationModel, - InstallResource, - ProblemDetails, + ProblemDetails} from '@umbraco-cms/backoffice/backend-api'; +import { + ApiError, + InstallResource } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; @@ -46,7 +49,7 @@ export class UmbInstallerDatabaseElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_INSTALLER_CONTEXT_TOKEN, (installerContext) => { + this.consumeContext(UMB_INSTALLER_CONTEXT, (installerContext) => { this._installerContext = installerContext; this._observeInstallerSettings(); this._observeInstallerData(); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.stories.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.stories.ts index 0620957353..ffbe94e609 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.stories.ts @@ -1,6 +1,6 @@ import './installer-database.element.js'; -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import { installerContextProvider } from '../shared/utils.story-helpers.js'; import type { UmbInstallerDatabaseElement } from './installer-database.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.element.ts index 8fdb1a0233..8694541d81 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.element.ts @@ -1,6 +1,8 @@ -import { UmbInstallerContext, UMB_INSTALLER_CONTEXT_TOKEN } from '../installer.context.js'; -import { css, CSSResultGroup, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbInstallerContext} from '../installer.context.js'; +import { UMB_INSTALLER_CONTEXT } from '../installer.context.js'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import type { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-installer-error') @@ -13,7 +15,7 @@ export class UmbInstallerErrorElement extends UmbLitElement { connectedCallback() { super.connectedCallback(); - this.consumeContext(UMB_INSTALLER_CONTEXT_TOKEN, (installerContext) => { + this.consumeContext(UMB_INSTALLER_CONTEXT, (installerContext) => { this._installerContext = installerContext; this._observeInstallStatus(); }); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.stories.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.stories.ts index b741f96946..764377978c 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import { installerContextProvider } from '../shared/utils.story-helpers.js'; import { UmbInstallerContext } from '../installer.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/installer.context.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/installer.context.ts index b4d9a91c94..43568ce8ff 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/installer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/installer.context.ts @@ -1,9 +1,10 @@ import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { +import type { InstallVResponseModel, - InstallResource, InstallSettingsResponseModel, - ProblemDetails, + ProblemDetails} from '@umbraco-cms/backoffice/backend-api'; +import { + InstallResource, TelemetryLevelModel, } from '@umbraco-cms/backoffice/backend-api'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; @@ -62,7 +63,7 @@ export class UmbInstallerContext { * @memberof UmbInstallerContext */ public nextStep(): void { - this._currentStep.next(this._currentStep.getValue() + 1); + this._currentStep.setValue(this._currentStep.getValue() + 1); } /** @@ -71,7 +72,7 @@ export class UmbInstallerContext { * @memberof UmbInstallerContext */ public prevStep(): void { - this._currentStep.next(this._currentStep.getValue() - 1); + this._currentStep.setValue(this._currentStep.getValue() - 1); } /** @@ -80,8 +81,8 @@ export class UmbInstallerContext { * @memberof UmbInstallerContext */ public reset(): void { - this._installStatus.next(null); - this._currentStep.next(1); + this._installStatus.setValue(null); + this._currentStep.setValue(1); } /** @@ -91,7 +92,7 @@ export class UmbInstallerContext { * @memberof UmbInstallerContext */ public appendData(data: Partial): void { - this._data.next({ ...this.getData(), ...data }); + this._data.setValue({ ...this.getData(), ...data }); } /** @@ -111,7 +112,7 @@ export class UmbInstallerContext { * @memberof UmbInstallerContext */ public setInstallStatus(status: ProblemDetails | null): void { - this._installStatus.next(status); + this._installStatus.setValue(status); } /** @@ -122,11 +123,11 @@ export class UmbInstallerContext { private async _loadInstallerSettings() { const { data, error } = await tryExecute(InstallResource.getInstallSettings()); if (data) { - this._settings.next(data); + this._settings.setValue(data); } else if (error) { - this._installStatus.next(error); + this._installStatus.setValue(error); } } } -export const UMB_INSTALLER_CONTEXT_TOKEN = new UmbContextToken('UmbInstallerContext'); +export const UMB_INSTALLER_CONTEXT = new UmbContextToken('UmbInstallerContext'); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/installer.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/installer.element.ts index 3f5642cc9f..94e27b85e8 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/installer.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/installer.element.ts @@ -1,5 +1,6 @@ -import { UmbInstallerContext, UMB_INSTALLER_CONTEXT_TOKEN } from './installer.context.js'; -import { css, CSSResultGroup, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbInstallerContext, UMB_INSTALLER_CONTEXT } from './installer.context.js'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './consent/installer-consent.element.js'; @@ -18,7 +19,7 @@ export class UmbInstallerElement extends UmbLitElement { constructor() { super(); - this.provideContext(UMB_INSTALLER_CONTEXT_TOKEN, this._umbInstallerContext); + this.provideContext(UMB_INSTALLER_CONTEXT, this._umbInstallerContext); } connectedCallback(): void { diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/installer.stories.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/installer.stories.ts index a98d286b81..97d1bed50a 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/installer.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/installer.stories.ts @@ -1,4 +1,4 @@ -import { Meta } from '@storybook/web-components'; +import type { Meta } from '@storybook/web-components'; import { html } from '@umbraco-cms/backoffice/external/lit'; import './index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.element.ts index 6f64b22b77..b5a14a6111 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.element.ts @@ -1,4 +1,5 @@ -import { css, CSSResultGroup, html, LitElement, customElement } from '@umbraco-cms/backoffice/external/lit'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, LitElement, customElement } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-installer-installing') export class UmbInstallerInstallingElement extends LitElement { diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.stories.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.stories.ts index 84843b9b02..6bd6dea44e 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import { installerContextProvider } from '../shared/utils.story-helpers.js'; import type { UmbInstallerInstallingElement } from './installer-installing.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.element.ts index 10e4394320..3ddba2d708 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.element.ts @@ -1,4 +1,5 @@ -import { css, CSSResultGroup, html, LitElement, customElement } from '@umbraco-cms/backoffice/external/lit'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, LitElement, customElement } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-installer-layout') export class UmbInstallerLayoutElement extends LitElement { diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.stories.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.stories.ts index 97c6b4d8b3..ae85e969ce 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbInstallerLayoutElement } from './installer-layout.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.element.ts index fbfef955af..e1e13f2808 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.element.ts @@ -1,5 +1,7 @@ -import { UmbInstallerContext, UMB_INSTALLER_CONTEXT_TOKEN } from '../installer.context.js'; -import { css, CSSResultGroup, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbInstallerContext} from '../installer.context.js'; +import { UMB_INSTALLER_CONTEXT } from '../installer.context.js'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-installer-user') @@ -12,7 +14,7 @@ export class UmbInstallerUserElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_INSTALLER_CONTEXT_TOKEN, (installerContext) => { + this.consumeContext(UMB_INSTALLER_CONTEXT, (installerContext) => { this._installerContext = installerContext; this._observeInstallerData(); }); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.stories.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.stories.ts index 1e206c351d..5e7fb00146 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import { installerContextProvider } from '../shared/utils.story-helpers.js'; import type { UmbInstallerUserElement } from './installer-user.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/apps/upgrader/upgrader-view.element.ts b/src/Umbraco.Web.UI.Client/src/apps/upgrader/upgrader-view.element.ts index 8640a70ffd..b421c84536 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/upgrader/upgrader-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/upgrader/upgrader-view.element.ts @@ -1,13 +1,14 @@ +import type { + CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; import { css, - CSSResultGroup, html, LitElement, customElement, property, ifDefined, } from '@umbraco-cms/backoffice/external/lit'; -import { UpgradeSettingsResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UpgradeSettingsResponseModel } from '@umbraco-cms/backoffice/backend-api'; /** * @element umb-upgrader-view diff --git a/src/Umbraco.Web.UI.Client/src/apps/upgrader/upgrader.element.ts b/src/Umbraco.Web.UI.Client/src/apps/upgrader/upgrader.element.ts index 7d7073d692..4a7ef907ef 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/upgrader/upgrader.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/upgrader/upgrader.element.ts @@ -1,5 +1,6 @@ import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UpgradeResource, UpgradeSettingsResponseModel, ApiError } from '@umbraco-cms/backoffice/backend-api'; +import type { UpgradeSettingsResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { UpgradeResource, ApiError } from '@umbraco-cms/backoffice/backend-api'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts index d3b00b4443..07529c2a54 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts @@ -1156,6 +1156,38 @@ export default { pickedTrashedItem: 'Du har valgt et dokument som er slettet eller lagt i papirkurven', pickedTrashedItems: 'Du har valgt dokumenter som er slettede eller lagt i papirkurven', }, + dynamicRoot: { + configurationTitle: 'Dynamisk udgangspunkts forespørgsel', + pickDynamicRootOriginTitle: 'Vælg begyndelsen', + pickDynamicRootOriginDesc: 'Beskriv begyndelsen for dynamisk udgangspunkts forespørgselen', + originRootTitle: 'Roden', + originRootDesc: 'Rod noden for denne kilde', + originParentTitle: 'Overliggende', + originParentDesc: 'Den overliggende node af kilden i denne redigerings session', + originCurrentTitle: 'Nuværende', + originCurrentDesc: 'Kilde noden for denne redigerings session', + originSiteTitle: 'Siden', + originSiteDesc: 'Nærmeste node med et domæne', + originByKeyTitle: 'Specifik Node', + originByKeyDesc: 'Vælg en specifik Node', + pickDynamicRootQueryStepTitle: 'Tilføj skridt til forespørgsel', + pickDynamicRootQueryStepDesc: 'Specificer næste skridt i din dynamisk udgangspunkts forespørgsel', + queryStepNearestAncestorOrSelfTitle: 'Nærmeste forældre eller selv', + queryStepNearestAncestorOrSelfDesc: 'Forespørg the nærmeste forældre eller selv der passer på en af de givne typer', + queryStepFurthestAncestorOrSelfTitle: 'Fjerneste forældre eller selv', + queryStepFurthestAncestorOrSelfDesc: 'Forespørg fjerneste forældre eller selv der passer på en af de givne typer', + queryStepNearestDescendantOrSelfTitle: 'Nærmeste barn eller selv', + queryStepNearestDescendantOrSelfDesc: 'Forespørg nærmeste barn eller selv der passer på en af de givne typer', + queryStepFurthestDescendantOrSelfTitle: 'Fjerneste barn eller selv', + queryStepFurthestDescendantOrSelfDesc: 'Forespørg fjerneste barn eller selv der passer på en af de givne typer', + queryStepCustomTitle: 'Brugerdefineret', + queryStepCustomDesc: 'Forespørg med et skræddersyet forespørgsels skridt', + addQueryStep: 'Tilføj skridt', + queryStepTypes: 'der passer med typerne: ', + noValidStartNodeTitle: 'Intet passende indhold', + noValidStartNodeDesc: + 'Konfigurationen af dette felt passer ikke med noget indhold. Opret det manglende indhold eller kontakt din adminnistrator for at tilpasse Dynamisk Udgangspunkts Forespørgselen for dette felt.', + }, mediaPicker: { deletedItem: 'Slettet medie', pickedTrashedItem: 'Du har valgt et medie som er slettet eller lagt i papirkurven', @@ -3217,7 +3249,7 @@ export default { minimalLevelDescription: 'We will only send an anonymized site ID to let us know that the site exists.', basicLevelDescription: 'We will send an anonymized site ID, Umbraco version, and packages installed', detailedLevelDescription: - '\n We will send:\n
    \n
  • Anonymized site ID, Umbraco version, and packages installed.
  • \n
  • Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use.
  • \n
  • System information: Webserver, server OS, server framework, server OS language, and database provider.
  • \n
  • Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode.
  • \n
\n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n
By choosing "Detailed" you agree to current and future anonymized information being collected.
\n ', + '\n We will send:\n
    \n
  • Anonymized site ID, Umbraco version, and packages installed.
  • \n
  • Number of: Root nodes, Content nodes, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use.
  • \n
  • System information: Webserver, server OS, server framework, server OS language, and database provider.
  • \n
  • Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode.
  • \n
\n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n
By choosing "Detailed" you agree to current and future anonymized information being collected.
\n ', }, umbId: { editProfile: 'Edit your Umbraco ID profile', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts index cfbeba5478..8a10ec8a7f 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts @@ -1148,11 +1148,46 @@ export default { }, contentPicker: { allowedItemTypes: 'You can only select items of type(s): %0%', - defineDynamicRoot: 'Specify a Dynamic Root', + defineDynamicRoot: 'Specify root node', defineRootNode: 'Pick root node', pickedTrashedItem: 'You have picked a content item currently deleted or in the recycle bin', pickedTrashedItems: 'You have picked content items currently deleted or in the recycle bin', }, + dynamicRoot: { + configurationTitle: 'Dynamic Root Query', + pickDynamicRootOriginTitle: 'Pick origin', + pickDynamicRootOriginDesc: 'Define the origin for your Dynamic Root Query', + originRootTitle: 'Root', + originRootDesc: 'Root node of this editing session', + originParentTitle: 'Parent', + originParentDesc: 'The parent node of the source in this editing session', + originCurrentTitle: 'Current', + originCurrentDesc: 'The content node that is source for this editing session', + originSiteTitle: 'Site', + originSiteDesc: 'Find nearest node with a hostname', + originByKeyTitle: 'Specific Node', + originByKeyDesc: 'Pick a specific Node as the origin for this query', + pickDynamicRootQueryStepTitle: 'Append step to query', + pickDynamicRootQueryStepDesc: 'Define the next step of your Dynamic Root Query', + queryStepNearestAncestorOrSelfTitle: 'Nearest Ancestor Or Self', + queryStepNearestAncestorOrSelfDesc: 'Query the nearest ancestor or self that fits with one of the configured types', + queryStepFurthestAncestorOrSelfTitle: 'Furthest Ancestor Or Self', + queryStepFurthestAncestorOrSelfDesc: + 'Query the Furthest ancestor or self that fits with one of the configured types', + queryStepNearestDescendantOrSelfTitle: 'Nearest Descendant Or Self', + queryStepNearestDescendantOrSelfDesc: + 'Query the nearest descendant or self that fits with one of the configured types', + queryStepFurthestDescendantOrSelfTitle: 'Furthest Descendant Or Self', + queryStepFurthestDescendantOrSelfDesc: + 'Query the Furthest descendant or self that fits with one of the configured types', + queryStepCustomTitle: 'Custom', + queryStepCustomDesc: 'Query the using a custom Query Step', + addQueryStep: 'Add query step', + queryStepTypes: 'That matches types: ', + noValidStartNodeTitle: 'No matching content', + noValidStartNodeDesc: + 'The configuration of this property does not match any content. Create the missing content or contact your administrator to adjust the Dynamic Root settings for this property.', + }, mediaPicker: { deletedItem: 'Deleted item', pickedTrashedItem: 'You have picked a media item currently deleted or in the recycle bin', @@ -1522,6 +1557,7 @@ export default { addGroup: 'Add group', inheritedFrom: 'Inherited from', addProperty: 'Add property', + editProperty: 'Edit property', requiredLabel: 'Required label', enableListViewHeading: 'Enable list view', enableListViewDescription: @@ -2469,7 +2505,7 @@ export default { minimalLevelDescription: 'We will only send an anonymized site ID to let us know that the site exists.', basicLevelDescription: 'We will send an anonymized site ID, Umbraco version, and packages installed', detailedLevelDescription: - '\n We will send:\n
    \n
  • Anonymized site ID, Umbraco version, and packages installed.
  • \n
  • Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use.
  • \n
  • System information: Webserver, server OS, server framework, server OS language, and database provider.
  • \n
  • Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode.
  • \n
\n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n
By choosing "Detailed" you agree to current and future anonymized information being collected.
\n ', + '\n We will send:\n
    \n
  • Anonymized site ID, Umbraco version, and packages installed.
  • \n
  • Number of: Root nodes, Content nodes, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use.
  • \n
  • System information: Webserver, server OS, server framework, server OS language, and database provider.
  • \n
  • Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode.
  • \n
\n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n
By choosing "Detailed" you agree to current and future anonymized information being collected.
\n ', }, umbId: { editProfile: 'Edit your Umbraco ID profile', diff --git a/src/Umbraco.Web.UI.Client/src/css/rte-content.css b/src/Umbraco.Web.UI.Client/src/css/rte-content.css new file mode 100644 index 0000000000..2e6d1c23dc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/css/rte-content.css @@ -0,0 +1,49 @@ +.umb-macro-holder { + border: 3px dotted red; + padding: 7px; + margin: 3px; + display: block; + position: relative; +} + +.umb-macro-holder::after { + content: 'Macros are no longer supported. Please use the block picker instead.'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: white; + background-color: rgba(0, 0, 0, 0.7); + padding: 10px; + border-radius: 5px; +} + +.umb-embed-holder { + position: relative; +} + +.umb-embed-holder > * { + user-select: none; + pointer-events: none; +} + +.umb-embed-holder[data-mce-selected] { + outline: 2px solid var(--uui-palette-spanish-pink-light); +} + +.umb-embed-holder::before { + z-index: 1000; + width: 100%; + height: 100%; + position: absolute; + content: ' '; +} + +.umb-embed-holder[data-mce-selected]::before { + background: rgba(0, 0, 0, 0.025); +} + +*[data-mce-selected='inline-boundary'] { + background: rgba(0, 0, 0, 0.025); + outline: 2px solid var(--uui-palette-spanish-pink-light); +} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts index cfccd9a5f3..161690f058 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts @@ -7,24 +7,34 @@ export { CancelablePromise, CancelError } from './core/CancelablePromise'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; +export type { AllowedContentTypeModel } from './models/AllowedContentTypeModel'; +export type { AllowedDocumentTypeModel } from './models/AllowedDocumentTypeModel'; +export type { AllowedMediaTypeModel } from './models/AllowedMediaTypeModel'; export type { AuditLogBaseModel } from './models/AuditLogBaseModel'; export type { AuditLogResponseModel } from './models/AuditLogResponseModel'; export type { AuditLogWithUsernameResponseModel } from './models/AuditLogWithUsernameResponseModel'; export { AuditTypeModel } from './models/AuditTypeModel'; +export type { AvailableContentTypeCompositionResponseModelBaseModel } from './models/AvailableContentTypeCompositionResponseModelBaseModel'; +export type { AvailableDocumentTypeCompositionResponseModel } from './models/AvailableDocumentTypeCompositionResponseModel'; +export type { AvailableMediaTypeCompositionResponseModel } from './models/AvailableMediaTypeCompositionResponseModel'; export type { ChangePasswordUserRequestModel } from './models/ChangePasswordUserRequestModel'; +export { CompositionTypeModel } from './models/CompositionTypeModel'; export type { ConsentLevelPresentationModel } from './models/ConsentLevelPresentationModel'; export type { ContentForDocumentResponseModel } from './models/ContentForDocumentResponseModel'; +export type { ContentForMediaResponseModel } from './models/ContentForMediaResponseModel'; export { ContentStateModel } from './models/ContentStateModel'; export type { ContentTreeItemResponseModel } from './models/ContentTreeItemResponseModel'; export type { ContentTypeCleanupModel } from './models/ContentTypeCleanupModel'; -export type { ContentTypeCompositionModel } from './models/ContentTypeCompositionModel'; -export { ContentTypeCompositionTypeModel } from './models/ContentTypeCompositionTypeModel'; +export type { ContentTypeCompositionRequestModelBaseModel } from './models/ContentTypeCompositionRequestModelBaseModel'; +export type { ContentTypeCompositionResponseModelBaseModel } from './models/ContentTypeCompositionResponseModelBaseModel'; export type { ContentTypeForDocumentTypeResponseModel } from './models/ContentTypeForDocumentTypeResponseModel'; export type { ContentTypeForMediaTypeResponseModel } from './models/ContentTypeForMediaTypeResponseModel'; -export type { ContentTypeSortModel } from './models/ContentTypeSortModel'; +export type { ContentTypeReferenceResponseModelBaseModel } from './models/ContentTypeReferenceResponseModelBaseModel'; export type { ContentUrlInfoModel } from './models/ContentUrlInfoModel'; export type { CopyDataTypeRequestModel } from './models/CopyDataTypeRequestModel'; export type { CopyDocumentRequestModel } from './models/CopyDocumentRequestModel'; +export type { CopyDocumentTypeRequestModel } from './models/CopyDocumentTypeRequestModel'; +export type { CopyMediaTypeRequestModel } from './models/CopyMediaTypeRequestModel'; export type { CreateContentForDocumentRequestModel } from './models/CreateContentForDocumentRequestModel'; export type { CreateContentForMediaRequestModel } from './models/CreateContentForMediaRequestModel'; export type { CreateContentTypeForDocumentTypeRequestModel } from './models/CreateContentTypeForDocumentTypeRequestModel'; @@ -43,20 +53,24 @@ export type { CreateMediaTypePropertyTypeContainerRequestModel } from './models/ export type { CreateMediaTypePropertyTypeRequestModel } from './models/CreateMediaTypePropertyTypeRequestModel'; export type { CreateMediaTypeRequestModel } from './models/CreateMediaTypeRequestModel'; export type { CreatePackageRequestModel } from './models/CreatePackageRequestModel'; +export type { CreatePartialViewFolderRequestModel } from './models/CreatePartialViewFolderRequestModel'; export type { CreatePartialViewRequestModel } from './models/CreatePartialViewRequestModel'; -export type { CreatePathFolderRequestModel } from './models/CreatePathFolderRequestModel'; export type { CreateRelationTypeRequestModel } from './models/CreateRelationTypeRequestModel'; +export type { CreateScriptFolderRequestModel } from './models/CreateScriptFolderRequestModel'; export type { CreateScriptRequestModel } from './models/CreateScriptRequestModel'; +export type { CreateStylesheetFolderRequestModel } from './models/CreateStylesheetFolderRequestModel'; export type { CreateStylesheetRequestModel } from './models/CreateStylesheetRequestModel'; export type { CreateTemplateRequestModel } from './models/CreateTemplateRequestModel'; -export type { CreateTextFileViewModelBaseModel } from './models/CreateTextFileViewModelBaseModel'; export type { CreateUserGroupRequestModel } from './models/CreateUserGroupRequestModel'; export type { CreateUserRequestModel } from './models/CreateUserRequestModel'; export type { CreateUserResponseModel } from './models/CreateUserResponseModel'; export type { CultureReponseModel } from './models/CultureReponseModel'; export type { CurrentUserResponseModel } from './models/CurrentUserResponseModel'; +export type { CurrenUserConfigurationResponseModel } from './models/CurrenUserConfigurationResponseModel'; export type { DatabaseInstallResponseModel } from './models/DatabaseInstallResponseModel'; export type { DatabaseSettingsPresentationModel } from './models/DatabaseSettingsPresentationModel'; +export { DataTypeChangeModeModel } from './models/DataTypeChangeModeModel'; +export type { DatatypeConfigurationResponseModel } from './models/DatatypeConfigurationResponseModel'; export type { DataTypeItemResponseModel } from './models/DataTypeItemResponseModel'; export type { DataTypeModelBaseModel } from './models/DataTypeModelBaseModel'; export type { DataTypePropertyPresentationModel } from './models/DataTypePropertyPresentationModel'; @@ -75,27 +89,49 @@ export { DirectionModel } from './models/DirectionModel'; export type { DisableUserRequestModel } from './models/DisableUserRequestModel'; export type { DocumentBlueprintResponseModel } from './models/DocumentBlueprintResponseModel'; export type { DocumentBlueprintTreeItemResponseModel } from './models/DocumentBlueprintTreeItemResponseModel'; +export type { DocumentConfigurationResponseModel } from './models/DocumentConfigurationResponseModel'; export type { DocumentItemResponseModel } from './models/DocumentItemResponseModel'; export type { DocumentNotificationResponseModel } from './models/DocumentNotificationResponseModel'; +export type { DocumentRecycleBinItemResponseModel } from './models/DocumentRecycleBinItemResponseModel'; export type { DocumentResponseModel } from './models/DocumentResponseModel'; export type { DocumentTreeItemResponseModel } from './models/DocumentTreeItemResponseModel'; +export type { DocumentTypeCompositionModel } from './models/DocumentTypeCompositionModel'; +export type { DocumentTypeCompositionRequestModel } from './models/DocumentTypeCompositionRequestModel'; +export type { DocumentTypeCompositionResponseModel } from './models/DocumentTypeCompositionResponseModel'; +export type { DocumentTypeConfigurationResponseModel } from './models/DocumentTypeConfigurationResponseModel'; export type { DocumentTypeItemResponseModel } from './models/DocumentTypeItemResponseModel'; export type { DocumentTypePropertyTypeContainerResponseModel } from './models/DocumentTypePropertyTypeContainerResponseModel'; export type { DocumentTypePropertyTypeResponseModel } from './models/DocumentTypePropertyTypeResponseModel'; +export type { DocumentTypeReferenceResponseModel } from './models/DocumentTypeReferenceResponseModel'; export type { DocumentTypeResponseModel } from './models/DocumentTypeResponseModel'; +export type { DocumentTypeSortModel } from './models/DocumentTypeSortModel'; export type { DocumentTypeTreeItemResponseModel } from './models/DocumentTypeTreeItemResponseModel'; export type { DocumentValueModel } from './models/DocumentValueModel'; +export type { DocumentVariantItemResponseModel } from './models/DocumentVariantItemResponseModel'; export type { DocumentVariantRequestModel } from './models/DocumentVariantRequestModel'; export type { DocumentVariantResponseModel } from './models/DocumentVariantResponseModel'; export type { DomainPresentationModel } from './models/DomainPresentationModel'; export type { DomainsPresentationModelBaseModel } from './models/DomainsPresentationModelBaseModel'; export type { DomainsResponseModel } from './models/DomainsResponseModel'; +export type { DynamicRootContextRequestModel } from './models/DynamicRootContextRequestModel'; +export type { DynamicRootQueryOriginRequestModel } from './models/DynamicRootQueryOriginRequestModel'; +export type { DynamicRootQueryRequestModel } from './models/DynamicRootQueryRequestModel'; +export type { DynamicRootQueryStepRequestModel } from './models/DynamicRootQueryStepRequestModel'; +export type { DynamicRootRequestModel } from './models/DynamicRootRequestModel'; +export type { DynamicRootResponseModel } from './models/DynamicRootResponseModel'; +export type { EnableTwoFactorRequestModel } from './models/EnableTwoFactorRequestModel'; export type { EnableUserRequestModel } from './models/EnableUserRequestModel'; export type { EntityTreeItemResponseModel } from './models/EntityTreeItemResponseModel'; -export type { ExtractRichTextStylesheetRulesRequestModel } from './models/ExtractRichTextStylesheetRulesRequestModel'; -export type { ExtractRichTextStylesheetRulesResponseModel } from './models/ExtractRichTextStylesheetRulesResponseModel'; export type { FieldPresentationModel } from './models/FieldPresentationModel'; -export type { FileItemResponseModelBaseModel } from './models/FileItemResponseModelBaseModel'; +export type { FileSystemCreateRequestModelBaseModel } from './models/FileSystemCreateRequestModelBaseModel'; +export type { FileSystemFileCreateRequestModelBaseModel } from './models/FileSystemFileCreateRequestModelBaseModel'; +export type { FileSystemFileResponseModelBaseModel } from './models/FileSystemFileResponseModelBaseModel'; +export type { FileSystemFileUpdateRequestModelBaseModel } from './models/FileSystemFileUpdateRequestModelBaseModel'; +export type { FileSystemFolderModel } from './models/FileSystemFolderModel'; +export type { FileSystemItemResponseModelBaseModel } from './models/FileSystemItemResponseModelBaseModel'; +export type { FileSystemItemViewModelBaseModel } from './models/FileSystemItemViewModelBaseModel'; +export type { FileSystemRenameRequestModelBaseModel } from './models/FileSystemRenameRequestModelBaseModel'; +export type { FileSystemResponseModelBaseModel } from './models/FileSystemResponseModelBaseModel'; export type { FileSystemTreeItemPresentationModel } from './models/FileSystemTreeItemPresentationModel'; export type { FolderModelBaseModel } from './models/FolderModelBaseModel'; export type { FolderResponseModel } from './models/FolderResponseModel'; @@ -115,9 +151,8 @@ export type { ImportDictionaryRequestModel } from './models/ImportDictionaryRequ export type { IndexResponseModel } from './models/IndexResponseModel'; export type { InstallSettingsResponseModel } from './models/InstallSettingsResponseModel'; export type { InstallVResponseModel } from './models/InstallVResponseModel'; -export type { InterpolateRichTextStylesheetRequestModel } from './models/InterpolateRichTextStylesheetRequestModel'; -export type { InterpolateRichTextStylesheetResponseModel } from './models/InterpolateRichTextStylesheetResponseModel'; export type { InviteUserRequestModel } from './models/InviteUserRequestModel'; +export type { ItemReferenceByIdResponseModel } from './models/ItemReferenceByIdResponseModel'; export type { ItemResponseModelBaseModel } from './models/ItemResponseModelBaseModel'; export type { ItemSortingRequestModel } from './models/ItemSortingRequestModel'; export type { LanguageItemResponseModel } from './models/LanguageItemResponseModel'; @@ -131,12 +166,20 @@ export { LogLevelModel } from './models/LogLevelModel'; export type { LogMessagePropertyPresentationModel } from './models/LogMessagePropertyPresentationModel'; export type { LogMessageResponseModel } from './models/LogMessageResponseModel'; export type { LogTemplateResponseModel } from './models/LogTemplateResponseModel'; +export type { MediaConfigurationResponseModel } from './models/MediaConfigurationResponseModel'; export type { MediaItemResponseModel } from './models/MediaItemResponseModel'; +export type { MediaRecycleBinItemResponseModel } from './models/MediaRecycleBinItemResponseModel'; +export type { MediaResponseModel } from './models/MediaResponseModel'; export type { MediaTreeItemResponseModel } from './models/MediaTreeItemResponseModel'; +export type { MediaTypeCompositionModel } from './models/MediaTypeCompositionModel'; +export type { MediaTypeCompositionRequestModel } from './models/MediaTypeCompositionRequestModel'; +export type { MediaTypeCompositionResponseModel } from './models/MediaTypeCompositionResponseModel'; export type { MediaTypeItemResponseModel } from './models/MediaTypeItemResponseModel'; export type { MediaTypePropertyTypeContainerResponseModel } from './models/MediaTypePropertyTypeContainerResponseModel'; export type { MediaTypePropertyTypeResponseModel } from './models/MediaTypePropertyTypeResponseModel'; +export type { MediaTypeReferenceResponseModel } from './models/MediaTypeReferenceResponseModel'; export type { MediaTypeResponseModel } from './models/MediaTypeResponseModel'; +export type { MediaTypeSortModel } from './models/MediaTypeSortModel'; export type { MediaTypeTreeItemResponseModel } from './models/MediaTypeTreeItemResponseModel'; export type { MediaValueModel } from './models/MediaValueModel'; export type { MediaVariantRequestModel } from './models/MediaVariantRequestModel'; @@ -149,26 +192,33 @@ export { ModelsModeModel } from './models/ModelsModeModel'; export type { MoveDataTypeRequestModel } from './models/MoveDataTypeRequestModel'; export type { MoveDictionaryRequestModel } from './models/MoveDictionaryRequestModel'; export type { MoveDocumentRequestModel } from './models/MoveDocumentRequestModel'; +export type { MoveDocumentTypeRequestModel } from './models/MoveDocumentTypeRequestModel'; export type { MoveMediaRequestModel } from './models/MoveMediaRequestModel'; +export type { MoveMediaTypeRequestModel } from './models/MoveMediaTypeRequestModel'; +export type { NamedEntityTreeItemResponseModel } from './models/NamedEntityTreeItemResponseModel'; +export type { NamedItemResponseModelBaseModel } from './models/NamedItemResponseModelBaseModel'; +export type { NoopSetupTwoFactorModel } from './models/NoopSetupTwoFactorModel'; export type { ObjectTypeResponseModel } from './models/ObjectTypeResponseModel'; export type { OkResult } from './models/OkResult'; export { OperatorModel } from './models/OperatorModel'; export type { OutOfDateStatusResponseModel } from './models/OutOfDateStatusResponseModel'; export { OutOfDateTypeModel } from './models/OutOfDateTypeModel'; +export type { PackageConfigurationResponseModel } from './models/PackageConfigurationResponseModel'; export type { PackageDefinitionResponseModel } from './models/PackageDefinitionResponseModel'; export type { PackageManifestResponseModel } from './models/PackageManifestResponseModel'; export type { PackageMigrationStatusResponseModel } from './models/PackageMigrationStatusResponseModel'; export type { PackageModelBaseModel } from './models/PackageModelBaseModel'; +export type { PagedAllowedDocumentTypeModel } from './models/PagedAllowedDocumentTypeModel'; +export type { PagedAllowedMediaTypeModel } from './models/PagedAllowedMediaTypeModel'; export type { PagedAuditLogResponseModel } from './models/PagedAuditLogResponseModel'; export type { PagedAuditLogWithUsernameResponseModel } from './models/PagedAuditLogWithUsernameResponseModel'; export type { PagedCultureReponseModel } from './models/PagedCultureReponseModel'; export type { PagedDataTypeTreeItemResponseModel } from './models/PagedDataTypeTreeItemResponseModel'; export type { PagedDictionaryOverviewResponseModel } from './models/PagedDictionaryOverviewResponseModel'; export type { PagedDocumentBlueprintTreeItemResponseModel } from './models/PagedDocumentBlueprintTreeItemResponseModel'; +export type { PagedDocumentRecycleBinItemResponseModel } from './models/PagedDocumentRecycleBinItemResponseModel'; export type { PagedDocumentTreeItemResponseModel } from './models/PagedDocumentTreeItemResponseModel'; -export type { PagedDocumentTypeResponseModel } from './models/PagedDocumentTypeResponseModel'; export type { PagedDocumentTypeTreeItemResponseModel } from './models/PagedDocumentTypeTreeItemResponseModel'; -export type { PagedEntityTreeItemResponseModel } from './models/PagedEntityTreeItemResponseModel'; export type { PagedFileSystemTreeItemPresentationModel } from './models/PagedFileSystemTreeItemPresentationModel'; export type { PagedHealthCheckGroupResponseModel } from './models/PagedHealthCheckGroupResponseModel'; export type { PagedHelpPageResponseModel } from './models/PagedHelpPageResponseModel'; @@ -177,31 +227,31 @@ export type { PagedLanguageResponseModel } from './models/PagedLanguageResponseM export type { PagedLoggerResponseModel } from './models/PagedLoggerResponseModel'; export type { PagedLogMessageResponseModel } from './models/PagedLogMessageResponseModel'; export type { PagedLogTemplateResponseModel } from './models/PagedLogTemplateResponseModel'; +export type { PagedMediaRecycleBinItemResponseModel } from './models/PagedMediaRecycleBinItemResponseModel'; export type { PagedMediaTreeItemResponseModel } from './models/PagedMediaTreeItemResponseModel'; export type { PagedMediaTypeTreeItemResponseModel } from './models/PagedMediaTypeTreeItemResponseModel'; +export type { PagedNamedEntityTreeItemResponseModel } from './models/PagedNamedEntityTreeItemResponseModel'; export type { PagedObjectTypeResponseModel } from './models/PagedObjectTypeResponseModel'; export type { PagedPackageDefinitionResponseModel } from './models/PagedPackageDefinitionResponseModel'; export type { PagedPackageMigrationStatusResponseModel } from './models/PagedPackageMigrationStatusResponseModel'; +export type { PagedPartialViewSnippetItemResponseModel } from './models/PagedPartialViewSnippetItemResponseModel'; export type { PagedProblemDetailsModel } from './models/PagedProblemDetailsModel'; -export type { PagedRecycleBinItemResponseModel } from './models/PagedRecycleBinItemResponseModel'; export type { PagedRedirectUrlResponseModel } from './models/PagedRedirectUrlResponseModel'; export type { PagedRelationItemResponseModel } from './models/PagedRelationItemResponseModel'; export type { PagedRelationResponseModel } from './models/PagedRelationResponseModel'; export type { PagedSavedLogSearchResponseModel } from './models/PagedSavedLogSearchResponseModel'; export type { PagedSearcherResponseModel } from './models/PagedSearcherResponseModel'; export type { PagedSearchResultResponseModel } from './models/PagedSearchResultResponseModel'; -export type { PagedSnippetItemResponseModel } from './models/PagedSnippetItemResponseModel'; -export type { PagedStylesheetOverviewResponseModel } from './models/PagedStylesheetOverviewResponseModel'; export type { PagedTagResponseModel } from './models/PagedTagResponseModel'; export type { PagedTelemetryResponseModel } from './models/PagedTelemetryResponseModel'; export type { PagedUserGroupResponseModel } from './models/PagedUserGroupResponseModel'; export type { PagedUserResponseModel } from './models/PagedUserResponseModel'; +export type { PartialViewFolderResponseModel } from './models/PartialViewFolderResponseModel'; export type { PartialViewItemResponseModel } from './models/PartialViewItemResponseModel'; export type { PartialViewResponseModel } from './models/PartialViewResponseModel'; +export type { PartialViewSnippetItemResponseModel } from './models/PartialViewSnippetItemResponseModel'; export type { PartialViewSnippetResponseModel } from './models/PartialViewSnippetResponseModel'; -export type { PartialViewUpdateModel } from './models/PartialViewUpdateModel'; -export type { PathFolderModelBaseModel } from './models/PathFolderModelBaseModel'; -export type { PathFolderResponseModel } from './models/PathFolderResponseModel'; +export type { PasswordConfigurationResponseModel } from './models/PasswordConfigurationResponseModel'; export type { ProblemDetails } from './models/ProblemDetails'; export type { ProblemDetailsBuilderModel } from './models/ProblemDetailsBuilderModel'; export type { ProfilingStatusRequestModel } from './models/ProfilingStatusRequestModel'; @@ -215,49 +265,53 @@ export type { PublicAccessRequestModel } from './models/PublicAccessRequestModel export type { PublicAccessResponseModel } from './models/PublicAccessResponseModel'; export type { PublishDocumentRequestModel } from './models/PublishDocumentRequestModel'; export type { PublishDocumentWithDescendantsRequestModel } from './models/PublishDocumentWithDescendantsRequestModel'; -export { PublishedStateModel } from './models/PublishedStateModel'; -export type { RecycleBinItemResponseModel } from './models/RecycleBinItemResponseModel'; +export type { RecycleBinItemResponseModelBaseModel } from './models/RecycleBinItemResponseModelBaseModel'; export { RedirectStatusModel } from './models/RedirectStatusModel'; export type { RedirectUrlResponseModel } from './models/RedirectUrlResponseModel'; export type { RedirectUrlStatusResponseModel } from './models/RedirectUrlStatusResponseModel'; +export type { ReferenceByIdModel } from './models/ReferenceByIdModel'; export type { RelationItemResponseModel } from './models/RelationItemResponseModel'; export type { RelationResponseModel } from './models/RelationResponseModel'; export type { RelationTypeBaseModel } from './models/RelationTypeBaseModel'; export type { RelationTypeItemResponseModel } from './models/RelationTypeItemResponseModel'; export type { RelationTypeResponseModel } from './models/RelationTypeResponseModel'; +export type { RenamePartialViewRequestModel } from './models/RenamePartialViewRequestModel'; +export type { RenameScriptRequestModel } from './models/RenameScriptRequestModel'; +export type { RenameStylesheetRequestModel } from './models/RenameStylesheetRequestModel'; export type { ResendInviteUserRequestModel } from './models/ResendInviteUserRequestModel'; export type { ResetPasswordRequestModel } from './models/ResetPasswordRequestModel'; export type { ResetPasswordTokenRequestModel } from './models/ResetPasswordTokenRequestModel'; -export type { RichTextRuleModel } from './models/RichTextRuleModel'; -export type { RichTextStylesheetRulesResponseModel } from './models/RichTextStylesheetRulesResponseModel'; export { RuntimeLevelModel } from './models/RuntimeLevelModel'; +export { RuntimeModeModel } from './models/RuntimeModeModel'; export type { SavedLogSearchPresenationBaseModel } from './models/SavedLogSearchPresenationBaseModel'; export type { SavedLogSearchRequestModel } from './models/SavedLogSearchRequestModel'; export type { SavedLogSearchResponseModel } from './models/SavedLogSearchResponseModel'; +export type { ScriptFolderResponseModel } from './models/ScriptFolderResponseModel'; export type { ScriptItemResponseModel } from './models/ScriptItemResponseModel'; export type { ScriptResponseModel } from './models/ScriptResponseModel'; -export type { ScriptUpdateModel } from './models/ScriptUpdateModel'; -export type { ScriptViewModelBaseModel } from './models/ScriptViewModelBaseModel'; export type { SearcherResponseModel } from './models/SearcherResponseModel'; export type { SearchResultResponseModel } from './models/SearchResultResponseModel'; -export type { ServerInformationItemResponseModel } from './models/ServerInformationItemResponseModel'; +export type { SecurityConfigurationResponseModel } from './models/SecurityConfigurationResponseModel'; +export type { ServerConfigurationBaseModel } from './models/ServerConfigurationBaseModel'; +export type { ServerConfigurationItemResponseModel } from './models/ServerConfigurationItemResponseModel'; +export type { ServerConfigurationResponseModel } from './models/ServerConfigurationResponseModel'; export type { ServerInformationResponseModel } from './models/ServerInformationResponseModel'; export type { ServerStatusResponseModel } from './models/ServerStatusResponseModel'; +export type { ServerTroubleshootingResponseModel } from './models/ServerTroubleshootingResponseModel'; export type { SetAvatarRequestModel } from './models/SetAvatarRequestModel'; export type { SetTourStatusRequestModel } from './models/SetTourStatusRequestModel'; -export type { SnippetItemResponseModel } from './models/SnippetItemResponseModel'; export type { SortingRequestModel } from './models/SortingRequestModel'; export type { StaticFileItemResponseModel } from './models/StaticFileItemResponseModel'; export { StatusResultTypeModel } from './models/StatusResultTypeModel'; +export type { StylesheetFolderResponseModel } from './models/StylesheetFolderResponseModel'; export type { StylesheetItemResponseModel } from './models/StylesheetItemResponseModel'; -export type { StylesheetOverviewResponseModel } from './models/StylesheetOverviewResponseModel'; export type { StylesheetResponseModel } from './models/StylesheetResponseModel'; -export type { StylesheetUpdateModel } from './models/StylesheetUpdateModel'; export type { TagResponseModel } from './models/TagResponseModel'; export { TelemetryLevelModel } from './models/TelemetryLevelModel'; export type { TelemetryRepresentationBaseModel } from './models/TelemetryRepresentationBaseModel'; export type { TelemetryRequestModel } from './models/TelemetryRequestModel'; export type { TelemetryResponseModel } from './models/TelemetryResponseModel'; +export type { TemplateConfigurationResponseModel } from './models/TemplateConfigurationResponseModel'; export type { TemplateItemResponseModel } from './models/TemplateItemResponseModel'; export type { TemplateModelBaseModel } from './models/TemplateModelBaseModel'; export type { TemplateQueryExecuteFilterPresentationModel } from './models/TemplateQueryExecuteFilterPresentationModel'; @@ -272,9 +326,6 @@ export type { TemplateQuerySettingsResponseModel } from './models/TemplateQueryS export type { TemplateResponseModel } from './models/TemplateResponseModel'; export type { TemplateScaffoldResponseModel } from './models/TemplateScaffoldResponseModel'; export type { TemporaryFileResponseModel } from './models/TemporaryFileResponseModel'; -export type { TextFileResponseModelBaseModel } from './models/TextFileResponseModelBaseModel'; -export type { TextFileUpdateModel } from './models/TextFileUpdateModel'; -export type { TextFileViewModelBaseModel } from './models/TextFileViewModelBaseModel'; export type { TourStatusModel } from './models/TourStatusModel'; export type { TreeItemPresentationModel } from './models/TreeItemPresentationModel'; export type { UnlockUsersRequestModel } from './models/UnlockUsersRequestModel'; @@ -303,11 +354,11 @@ export type { UpdateRelationTypeRequestModel } from './models/UpdateRelationType export type { UpdateScriptRequestModel } from './models/UpdateScriptRequestModel'; export type { UpdateStylesheetRequestModel } from './models/UpdateStylesheetRequestModel'; export type { UpdateTemplateRequestModel } from './models/UpdateTemplateRequestModel'; -export type { UpdateTextFileViewModelBaseModel } from './models/UpdateTextFileViewModelBaseModel'; export type { UpdateUserGroupRequestModel } from './models/UpdateUserGroupRequestModel'; export type { UpdateUserGroupsOnUserRequestModel } from './models/UpdateUserGroupsOnUserRequestModel'; export type { UpdateUserRequestModel } from './models/UpdateUserRequestModel'; export type { UpgradeSettingsResponseModel } from './models/UpgradeSettingsResponseModel'; +export type { UserConfigurationResponseModel } from './models/UserConfigurationResponseModel'; export type { UserGroupBaseModel } from './models/UserGroupBaseModel'; export type { UserGroupItemResponseModel } from './models/UserGroupItemResponseModel'; export type { UserGroupResponseModel } from './models/UserGroupResponseModel'; @@ -321,13 +372,14 @@ export type { UserResponseModel } from './models/UserResponseModel'; export type { UserSettingsModel } from './models/UserSettingsModel'; export { UserStateModel } from './models/UserStateModel'; export type { UserTourStatusesResponseModel } from './models/UserTourStatusesResponseModel'; +export type { UserTwoFactorProviderModel } from './models/UserTwoFactorProviderModel'; export type { ValueModelBaseModel } from './models/ValueModelBaseModel'; +export type { VariantItemResponseModel } from './models/VariantItemResponseModel'; +export type { VariantItemResponseModelBaseModel } from './models/VariantItemResponseModelBaseModel'; export type { VariantModelBaseModel } from './models/VariantModelBaseModel'; export type { VariantResponseModelBaseModel } from './models/VariantResponseModelBaseModel'; -export type { VariantTreeItemModel } from './models/VariantTreeItemModel'; export type { VerifyInviteUserRequestModel } from './models/VerifyInviteUserRequestModel'; export type { VerifyResetPasswordTokenRequestModel } from './models/VerifyResetPasswordTokenRequestModel'; -export type { VersionResponseModel } from './models/VersionResponseModel'; export { AuditLogResource } from './services/AuditLogResource'; export { CultureResource } from './services/CultureResource'; @@ -336,6 +388,7 @@ export { DictionaryResource } from './services/DictionaryResource'; export { DocumentResource } from './services/DocumentResource'; export { DocumentBlueprintResource } from './services/DocumentBlueprintResource'; export { DocumentTypeResource } from './services/DocumentTypeResource'; +export { DynamicRootResource } from './services/DynamicRootResource'; export { HealthCheckResource } from './services/HealthCheckResource'; export { HelpResource } from './services/HelpResource'; export { IndexerResource } from './services/IndexerResource'; @@ -351,6 +404,7 @@ export { ModelsBuilderResource } from './services/ModelsBuilderResource'; export { ObjectTypesResource } from './services/ObjectTypesResource'; export { PackageResource } from './services/PackageResource'; export { PartialViewResource } from './services/PartialViewResource'; +export { PreviewResource } from './services/PreviewResource'; export { ProfilingResource } from './services/ProfilingResource'; export { PropertyTypeResource } from './services/PropertyTypeResource'; export { PublishedCacheResource } from './services/PublishedCacheResource'; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedContentTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedContentTypeModel.ts new file mode 100644 index 0000000000..c7197ce531 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedContentTypeModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type AllowedContentTypeModel = { + id: string; + name: string; + description?: string | null; + icon?: string | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedDocumentTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedDocumentTypeModel.ts new file mode 100644 index 0000000000..1762891713 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedDocumentTypeModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { AllowedContentTypeModel } from './AllowedContentTypeModel'; + +export type AllowedDocumentTypeModel = AllowedContentTypeModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewUpdateModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedMediaTypeModel.ts similarity index 50% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewUpdateModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedMediaTypeModel.ts index 37fbcef9b2..49ce218c3a 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewUpdateModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedMediaTypeModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { TextFileUpdateModel } from './TextFileUpdateModel'; +import type { AllowedContentTypeModel } from './AllowedContentTypeModel'; -export type PartialViewUpdateModel = TextFileUpdateModel; +export type AllowedMediaTypeModel = AllowedContentTypeModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RecycleBinItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableContentTypeCompositionResponseModelBaseModel.ts similarity index 56% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RecycleBinItemResponseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableContentTypeCompositionResponseModelBaseModel.ts index 68aa71111d..43625c7194 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RecycleBinItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableContentTypeCompositionResponseModelBaseModel.ts @@ -3,13 +3,11 @@ /* tslint:disable */ /* eslint-disable */ -export type RecycleBinItemResponseModel = { +export type AvailableContentTypeCompositionResponseModelBaseModel = { id: string; name: string; - type: string; icon: string; - hasChildren: boolean; - isContainer: boolean; - parentId?: string | null; + folderPath: Array; + isCompatible: boolean; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableDocumentTypeCompositionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableDocumentTypeCompositionResponseModel.ts new file mode 100644 index 0000000000..4b89e8a211 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableDocumentTypeCompositionResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { AvailableContentTypeCompositionResponseModelBaseModel } from './AvailableContentTypeCompositionResponseModelBaseModel'; + +export type AvailableDocumentTypeCompositionResponseModel = AvailableContentTypeCompositionResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMediaTypeCompositionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMediaTypeCompositionResponseModel.ts new file mode 100644 index 0000000000..fc784a2174 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMediaTypeCompositionResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { AvailableContentTypeCompositionResponseModelBaseModel } from './AvailableContentTypeCompositionResponseModelBaseModel'; + +export type AvailableMediaTypeCompositionResponseModel = AvailableContentTypeCompositionResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CompositionTypeModel.ts similarity index 81% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionTypeModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CompositionTypeModel.ts index 5e0b6b596f..63dfdae1e6 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionTypeModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CompositionTypeModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export enum ContentTypeCompositionTypeModel { +export enum CompositionTypeModel { COMPOSITION = 'Composition', INHERITANCE = 'Inheritance', } diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentForDocumentResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentForDocumentResponseModel.ts index 5316d49211..e248810d0d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentForDocumentResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentForDocumentResponseModel.ts @@ -10,6 +10,5 @@ export type ContentForDocumentResponseModel = { values: Array; variants: Array; id: string; - contentTypeId: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentForMediaResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentForMediaResponseModel.ts new file mode 100644 index 0000000000..5f4b42be51 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentForMediaResponseModel.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { MediaValueModel } from './MediaValueModel'; +import type { MediaVariantResponseModel } from './MediaVariantResponseModel'; + +export type ContentForMediaResponseModel = { + values: Array; + variants: Array; + id: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionModel.ts deleted file mode 100644 index 93a472eeb1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ContentTypeCompositionTypeModel } from './ContentTypeCompositionTypeModel'; - -export type ContentTypeCompositionModel = { - id: string; - compositionType: ContentTypeCompositionTypeModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionRequestModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionRequestModelBaseModel.ts new file mode 100644 index 0000000000..542c1c8653 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionRequestModelBaseModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ContentTypeCompositionRequestModelBaseModel = { + id?: string | null; + currentPropertyAliases: Array; + currentCompositeIds: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileItemResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionResponseModelBaseModel.ts similarity index 69% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileItemResponseModelBaseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionResponseModelBaseModel.ts index 0927830167..8de2c0f47e 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileItemResponseModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeCompositionResponseModelBaseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -export type FileItemResponseModelBaseModel = { +export type ContentTypeCompositionResponseModelBaseModel = { + id: string; name: string; - path: string; icon: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForDocumentTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForDocumentTypeResponseModel.ts index 88bddf263e..f5b3816589 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForDocumentTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForDocumentTypeResponseModel.ts @@ -3,8 +3,6 @@ /* tslint:disable */ /* eslint-disable */ -import type { ContentTypeCompositionModel } from './ContentTypeCompositionModel'; -import type { ContentTypeSortModel } from './ContentTypeSortModel'; import type { DocumentTypePropertyTypeContainerResponseModel } from './DocumentTypePropertyTypeContainerResponseModel'; import type { DocumentTypePropertyTypeResponseModel } from './DocumentTypePropertyTypeResponseModel'; @@ -19,8 +17,6 @@ export type ContentTypeForDocumentTypeResponseModel = { isElement: boolean; properties: Array; containers: Array; - allowedContentTypes: Array; - compositions: Array; id: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMediaTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMediaTypeResponseModel.ts index 9937d75829..457df240bc 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMediaTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMediaTypeResponseModel.ts @@ -3,8 +3,6 @@ /* tslint:disable */ /* eslint-disable */ -import type { ContentTypeCompositionModel } from './ContentTypeCompositionModel'; -import type { ContentTypeSortModel } from './ContentTypeSortModel'; import type { MediaTypePropertyTypeContainerResponseModel } from './MediaTypePropertyTypeContainerResponseModel'; import type { MediaTypePropertyTypeResponseModel } from './MediaTypePropertyTypeResponseModel'; @@ -19,8 +17,6 @@ export type ContentTypeForMediaTypeResponseModel = { isElement: boolean; properties: Array; containers: Array; - allowedContentTypes: Array; - compositions: Array; id: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeReferenceResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeReferenceResponseModelBaseModel.ts new file mode 100644 index 0000000000..a6e3ce7d8b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeReferenceResponseModelBaseModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ContentTypeReferenceResponseModelBaseModel = { + id: string; + icon: string; + hasListView: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentRequestModel.ts index 45bc6a294a..828849c9ac 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentRequestModel.ts @@ -3,8 +3,10 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + export type CopyDocumentRequestModel = { - targetId?: string | null; + target?: ReferenceByIdModel | null; relateToOriginal: boolean; includeDescendants: boolean; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentTypeRequestModel.ts new file mode 100644 index 0000000000..346920d256 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentTypeRequestModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + +export type CopyDocumentTypeRequestModel = { + target?: ReferenceByIdModel | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyMediaTypeRequestModel.ts new file mode 100644 index 0000000000..943722db52 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyMediaTypeRequestModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + +export type CopyMediaTypeRequestModel = { + target?: ReferenceByIdModel | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentForDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentForDocumentRequestModel.ts index 70f1abb553..b8ab5e9b48 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentForDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentForDocumentRequestModel.ts @@ -5,11 +5,12 @@ import type { DocumentValueModel } from './DocumentValueModel'; import type { DocumentVariantRequestModel } from './DocumentVariantRequestModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateContentForDocumentRequestModel = { values: Array; variants: Array; id?: string | null; - parentId?: string | null; + parent?: ReferenceByIdModel | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentForMediaRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentForMediaRequestModel.ts index 58ae8fb584..252171141b 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentForMediaRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentForMediaRequestModel.ts @@ -5,11 +5,12 @@ import type { MediaValueModel } from './MediaValueModel'; import type { MediaVariantRequestModel } from './MediaVariantRequestModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateContentForMediaRequestModel = { values: Array; variants: Array; id?: string | null; - parentId?: string | null; + parent?: ReferenceByIdModel | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForDocumentTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForDocumentTypeRequestModel.ts index 7fcbdef551..fa26c2f097 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForDocumentTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForDocumentTypeRequestModel.ts @@ -3,10 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ContentTypeCompositionModel } from './ContentTypeCompositionModel'; -import type { ContentTypeSortModel } from './ContentTypeSortModel'; import type { CreateDocumentTypePropertyTypeContainerRequestModel } from './CreateDocumentTypePropertyTypeContainerRequestModel'; import type { CreateDocumentTypePropertyTypeRequestModel } from './CreateDocumentTypePropertyTypeRequestModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateContentTypeForDocumentTypeRequestModel = { alias: string; @@ -19,9 +18,7 @@ export type CreateContentTypeForDocumentTypeRequestModel = { isElement: boolean; properties: Array; containers: Array; - allowedContentTypes: Array; - compositions: Array; id?: string | null; - containerId?: string | null; + folder?: ReferenceByIdModel | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMediaTypeRequestModel.ts index 70586787f1..16d446f260 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMediaTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMediaTypeRequestModel.ts @@ -3,10 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ContentTypeCompositionModel } from './ContentTypeCompositionModel'; -import type { ContentTypeSortModel } from './ContentTypeSortModel'; import type { CreateMediaTypePropertyTypeContainerRequestModel } from './CreateMediaTypePropertyTypeContainerRequestModel'; import type { CreateMediaTypePropertyTypeRequestModel } from './CreateMediaTypePropertyTypeRequestModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateContentTypeForMediaTypeRequestModel = { alias: string; @@ -19,9 +18,7 @@ export type CreateContentTypeForMediaTypeRequestModel = { isElement: boolean; properties: Array; containers: Array; - allowedContentTypes: Array; - compositions: Array; id?: string | null; - containerId?: string | null; + folder?: ReferenceByIdModel | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentRequestModel.ts index 0211ebb676..72400483f3 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentRequestModel.ts @@ -4,9 +4,10 @@ /* eslint-disable */ import type { CreateContentForDocumentRequestModel } from './CreateContentForDocumentRequestModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateDocumentRequestModel = (CreateContentForDocumentRequestModel & { - contentTypeId: string; - templateId?: string | null; + documentType: ReferenceByIdModel; + template?: ReferenceByIdModel | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypeRequestModel.ts index db2c65c7da..297668404c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypeRequestModel.ts @@ -5,10 +5,15 @@ import type { ContentTypeCleanupModel } from './ContentTypeCleanupModel'; import type { CreateContentTypeForDocumentTypeRequestModel } from './CreateContentTypeForDocumentTypeRequestModel'; +import type { DocumentTypeCompositionModel } from './DocumentTypeCompositionModel'; +import type { DocumentTypeSortModel } from './DocumentTypeSortModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateDocumentTypeRequestModel = (CreateContentTypeForDocumentTypeRequestModel & { - allowedTemplateIds: Array; - defaultTemplateId?: string | null; + allowedTemplates: Array; + defaultTemplate?: ReferenceByIdModel | null; cleanup: ContentTypeCleanupModel; + allowedDocumentTypes: Array; + compositions: Array; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaRequestModel.ts index dd025ec56a..937dcab69f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaRequestModel.ts @@ -4,8 +4,9 @@ /* eslint-disable */ import type { CreateContentForMediaRequestModel } from './CreateContentForMediaRequestModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateMediaRequestModel = (CreateContentForMediaRequestModel & { - contentTypeId: string; + mediaType: ReferenceByIdModel; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts index 1fcfe485ec..e143edb901 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts @@ -4,6 +4,11 @@ /* eslint-disable */ import type { CreateContentTypeForMediaTypeRequestModel } from './CreateContentTypeForMediaTypeRequestModel'; +import type { MediaTypeCompositionModel } from './MediaTypeCompositionModel'; +import type { MediaTypeSortModel } from './MediaTypeSortModel'; -export type CreateMediaTypeRequestModel = CreateContentTypeForMediaTypeRequestModel; +export type CreateMediaTypeRequestModel = (CreateContentTypeForMediaTypeRequestModel & { + allowedMediaTypes: Array; + compositions: Array; +}); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewFolderRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewFolderRequestModel.ts new file mode 100644 index 0000000000..fd1a8dbe23 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewFolderRequestModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemCreateRequestModelBaseModel } from './FileSystemCreateRequestModelBaseModel'; + +export type CreatePartialViewFolderRequestModel = FileSystemCreateRequestModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewRequestModel.ts index 145e99f5ad..ce26671883 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewRequestModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { CreateTextFileViewModelBaseModel } from './CreateTextFileViewModelBaseModel'; +import type { FileSystemFileCreateRequestModelBaseModel } from './FileSystemFileCreateRequestModelBaseModel'; -export type CreatePartialViewRequestModel = CreateTextFileViewModelBaseModel; +export type CreatePartialViewRequestModel = FileSystemFileCreateRequestModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePathFolderRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePathFolderRequestModel.ts deleted file mode 100644 index da2b6b5047..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePathFolderRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PathFolderModelBaseModel } from './PathFolderModelBaseModel'; - -export type CreatePathFolderRequestModel = (PathFolderModelBaseModel & { - parentPath?: string | null; -}); - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptFolderRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptFolderRequestModel.ts new file mode 100644 index 0000000000..4972e3c270 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptFolderRequestModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemCreateRequestModelBaseModel } from './FileSystemCreateRequestModelBaseModel'; + +export type CreateScriptFolderRequestModel = FileSystemCreateRequestModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptRequestModel.ts index da67c1a6be..999ca5c0d3 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptRequestModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { CreateTextFileViewModelBaseModel } from './CreateTextFileViewModelBaseModel'; +import type { FileSystemFileCreateRequestModelBaseModel } from './FileSystemFileCreateRequestModelBaseModel'; -export type CreateScriptRequestModel = CreateTextFileViewModelBaseModel; +export type CreateScriptRequestModel = FileSystemFileCreateRequestModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetFolderRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetFolderRequestModel.ts new file mode 100644 index 0000000000..3b901eff6e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetFolderRequestModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemCreateRequestModelBaseModel } from './FileSystemCreateRequestModelBaseModel'; + +export type CreateStylesheetFolderRequestModel = FileSystemCreateRequestModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetRequestModel.ts index 23e1f8b0a3..f682637920 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetRequestModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { CreateTextFileViewModelBaseModel } from './CreateTextFileViewModelBaseModel'; +import type { FileSystemFileCreateRequestModelBaseModel } from './FileSystemFileCreateRequestModelBaseModel'; -export type CreateStylesheetRequestModel = CreateTextFileViewModelBaseModel; +export type CreateStylesheetRequestModel = FileSystemFileCreateRequestModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTemplateRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTemplateRequestModel.ts index 0967f2a290..679cbc2a8e 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTemplateRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTemplateRequestModel.ts @@ -5,5 +5,7 @@ import type { TemplateModelBaseModel } from './TemplateModelBaseModel'; -export type CreateTemplateRequestModel = TemplateModelBaseModel; +export type CreateTemplateRequestModel = (TemplateModelBaseModel & { + key?: string | null; +}); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTextFileViewModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTextFileViewModelBaseModel.ts deleted file mode 100644 index 33b8864571..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTextFileViewModelBaseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TextFileViewModelBaseModel } from './TextFileViewModelBaseModel'; - -export type CreateTextFileViewModelBaseModel = (TextFileViewModelBaseModel & { - parentPath?: string | null; -}); - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrenUserConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrenUserConfigurationResponseModel.ts new file mode 100644 index 0000000000..4b398efa9d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrenUserConfigurationResponseModel.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { PasswordConfigurationResponseModel } from './PasswordConfigurationResponseModel'; + +export type CurrenUserConfigurationResponseModel = { + keepUserLoggedIn: boolean; + usernameIsEmail: boolean; + passwordConfiguration: PasswordConfigurationResponseModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeChangeModeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeChangeModeModel.ts new file mode 100644 index 0000000000..fe470165fb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeChangeModeModel.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export enum DataTypeChangeModeModel { + TRUE = 'True', + FALSE = 'False', + FALSE_WITH_HELP_TEXT = 'FalseWithHelpText', +} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeItemResponseModel.ts index 22f5a6e493..6c4fd4dbb3 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type DataTypeItemResponseModel = (ItemResponseModelBaseModel & { +export type DataTypeItemResponseModel = (NamedItemResponseModelBaseModel & { editorUiAlias?: string | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatatypeConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatatypeConfigurationResponseModel.ts new file mode 100644 index 0000000000..86aa086f3f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatatypeConfigurationResponseModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { DataTypeChangeModeModel } from './DataTypeChangeModeModel'; + +export type DatatypeConfigurationResponseModel = { + canBeChanged: DataTypeChangeModeModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemItemResponseModel.ts index d7e75cc2b9..38f73f486d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type DictionaryItemItemResponseModel = ItemResponseModelBaseModel; +export type DictionaryItemItemResponseModel = NamedItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintResponseModel.ts index c7a854a1aa..e894f9e29f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type DocumentBlueprintResponseModel = ItemResponseModelBaseModel; +export type DocumentBlueprintResponseModel = NamedItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts index 782469e577..cc1573f33e 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { EntityTreeItemResponseModel } from './EntityTreeItemResponseModel'; +import type { NamedEntityTreeItemResponseModel } from './NamedEntityTreeItemResponseModel'; -export type DocumentBlueprintTreeItemResponseModel = (EntityTreeItemResponseModel & { +export type DocumentBlueprintTreeItemResponseModel = (NamedEntityTreeItemResponseModel & { documentTypeId: string; documentTypeAlias: string; documentTypeName?: string | null; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentConfigurationResponseModel.ts new file mode 100644 index 0000000000..78fb81d996 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentConfigurationResponseModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type DocumentConfigurationResponseModel = { + sanitizeTinyMce: boolean; + disableDeleteWhenReferenced: boolean; + disableUnpublishWhenReferenced: boolean; + allowEditInvariantFromNonDefault: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentItemResponseModel.ts index c2ff002f8e..80630f509d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentItemResponseModel.ts @@ -3,11 +3,14 @@ /* tslint:disable */ /* eslint-disable */ +import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; +import type { DocumentVariantItemResponseModel } from './DocumentVariantItemResponseModel'; import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; export type DocumentItemResponseModel = (ItemResponseModelBaseModel & { - icon?: string | null; - contentTypeId: string; isTrashed: boolean; + isProtected: boolean; + documentType: DocumentTypeReferenceResponseModel; + variants: Array; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentRecycleBinItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentRecycleBinItemResponseModel.ts new file mode 100644 index 0000000000..c594d375b0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentRecycleBinItemResponseModel.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; +import type { DocumentVariantItemResponseModel } from './DocumentVariantItemResponseModel'; +import type { RecycleBinItemResponseModelBaseModel } from './RecycleBinItemResponseModelBaseModel'; + +export type DocumentRecycleBinItemResponseModel = (RecycleBinItemResponseModelBaseModel & { + documentType: DocumentTypeReferenceResponseModel; + variants: Array; +}); + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentResponseModel.ts index d30c2e4947..049f9b077a 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentResponseModel.ts @@ -5,10 +5,13 @@ import type { ContentForDocumentResponseModel } from './ContentForDocumentResponseModel'; import type { ContentUrlInfoModel } from './ContentUrlInfoModel'; +import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type DocumentResponseModel = (ContentForDocumentResponseModel & { urls: Array; - templateId?: string | null; + template?: ReferenceByIdModel | null; isTrashed: boolean; + documentType: DocumentTypeReferenceResponseModel; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTreeItemResponseModel.ts index dea10a27b6..3f202d48c6 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTreeItemResponseModel.ts @@ -4,14 +4,12 @@ /* eslint-disable */ import type { ContentTreeItemResponseModel } from './ContentTreeItemResponseModel'; -import type { VariantTreeItemModel } from './VariantTreeItemModel'; +import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; +import type { DocumentVariantItemResponseModel } from './DocumentVariantItemResponseModel'; export type DocumentTreeItemResponseModel = (ContentTreeItemResponseModel & { isProtected: boolean; - isPublished: boolean; - isEdited: boolean; - contentTypeId: string; - variants: Array; - icon: string; + documentType: DocumentTypeReferenceResponseModel; + variants: Array; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionModel.ts new file mode 100644 index 0000000000..5cb10be1d0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionModel.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { CompositionTypeModel } from './CompositionTypeModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + +export type DocumentTypeCompositionModel = { + documentType: ReferenceByIdModel; + compositionType: CompositionTypeModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionRequestModel.ts new file mode 100644 index 0000000000..344d632776 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionRequestModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ContentTypeCompositionRequestModelBaseModel } from './ContentTypeCompositionRequestModelBaseModel'; + +export type DocumentTypeCompositionRequestModel = (ContentTypeCompositionRequestModelBaseModel & { + isElement: boolean; +}); + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionResponseModel.ts new file mode 100644 index 0000000000..0377d10c3c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ContentTypeCompositionResponseModelBaseModel } from './ContentTypeCompositionResponseModelBaseModel'; + +export type DocumentTypeCompositionResponseModel = ContentTypeCompositionResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeConfigurationResponseModel.ts new file mode 100644 index 0000000000..b728fd3a12 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeConfigurationResponseModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { DataTypeChangeModeModel } from './DataTypeChangeModeModel'; + +export type DocumentTypeConfigurationResponseModel = { + dataTypesCanBeChanged: DataTypeChangeModeModel; + disableTemplates: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeItemResponseModel.ts index bc4e4e003e..1ed148dec1 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type DocumentTypeItemResponseModel = (ItemResponseModelBaseModel & { +export type DocumentTypeItemResponseModel = (NamedItemResponseModelBaseModel & { isElement: boolean; icon?: string | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeReferenceResponseModel.ts new file mode 100644 index 0000000000..1ce7ab1db8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeReferenceResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ContentTypeReferenceResponseModelBaseModel } from './ContentTypeReferenceResponseModelBaseModel'; + +export type DocumentTypeReferenceResponseModel = ContentTypeReferenceResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeResponseModel.ts index 7937954c88..376ad9d470 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeResponseModel.ts @@ -5,10 +5,15 @@ import type { ContentTypeCleanupModel } from './ContentTypeCleanupModel'; import type { ContentTypeForDocumentTypeResponseModel } from './ContentTypeForDocumentTypeResponseModel'; +import type { DocumentTypeCompositionModel } from './DocumentTypeCompositionModel'; +import type { DocumentTypeSortModel } from './DocumentTypeSortModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type DocumentTypeResponseModel = (ContentTypeForDocumentTypeResponseModel & { - allowedTemplateIds: Array; - defaultTemplateId?: string | null; + allowedTemplates: Array; + defaultTemplate?: ReferenceByIdModel | null; cleanup: ContentTypeCleanupModel; + allowedDocumentTypes: Array; + compositions: Array; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeSortModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeSortModel.ts new file mode 100644 index 0000000000..82dfba4614 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeSortModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + +export type DocumentTypeSortModel = { + documentType: ReferenceByIdModel; + sortOrder: number; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantItemResponseModel.ts new file mode 100644 index 0000000000..e5dc852c8c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantItemResponseModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ContentStateModel } from './ContentStateModel'; +import type { VariantItemResponseModelBaseModel } from './VariantItemResponseModelBaseModel'; + +export type DocumentVariantItemResponseModel = (VariantItemResponseModelBaseModel & { + state: ContentStateModel; +}); + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantTreeItemModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootContextRequestModel.ts similarity index 51% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantTreeItemModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootContextRequestModel.ts index d24ef88903..fb40f6012e 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantTreeItemModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootContextRequestModel.ts @@ -3,11 +3,10 @@ /* tslint:disable */ /* eslint-disable */ -import type { PublishedStateModel } from './PublishedStateModel'; - -export type VariantTreeItemModel = { - name: string; +export type DynamicRootContextRequestModel = { + id?: string | null; + parentId: string; culture?: string | null; - state: PublishedStateModel; + segment?: string | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryOriginRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryOriginRequestModel.ts new file mode 100644 index 0000000000..916d280a5e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryOriginRequestModel.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type DynamicRootQueryOriginRequestModel = { + alias: string; + key?: string | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryRequestModel.ts new file mode 100644 index 0000000000..429c72a4d4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryRequestModel.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { DynamicRootQueryOriginRequestModel } from './DynamicRootQueryOriginRequestModel'; +import type { DynamicRootQueryStepRequestModel } from './DynamicRootQueryStepRequestModel'; + +export type DynamicRootQueryRequestModel = { + origin: DynamicRootQueryOriginRequestModel; + steps: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryStepRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryStepRequestModel.ts new file mode 100644 index 0000000000..fad5ca362e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryStepRequestModel.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type DynamicRootQueryStepRequestModel = { + alias: string; + documentTypeIds: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootRequestModel.ts new file mode 100644 index 0000000000..14d3647bc1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootRequestModel.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { DynamicRootContextRequestModel } from './DynamicRootContextRequestModel'; +import type { DynamicRootQueryRequestModel } from './DynamicRootQueryRequestModel'; + +export type DynamicRootRequestModel = { + context: DynamicRootContextRequestModel; + query: DynamicRootQueryRequestModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InterpolateRichTextStylesheetResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootResponseModel.ts similarity index 63% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InterpolateRichTextStylesheetResponseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootResponseModel.ts index 772787281d..da6a956c7b 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InterpolateRichTextStylesheetResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type InterpolateRichTextStylesheetResponseModel = { - content: string; +export type DynamicRootResponseModel = { + roots: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EnableTwoFactorRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EnableTwoFactorRequestModel.ts new file mode 100644 index 0000000000..7c49e5b473 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EnableTwoFactorRequestModel.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type EnableTwoFactorRequestModel = { + code: string; + secret: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EntityTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EntityTreeItemResponseModel.ts index fa07541f16..d14eb5cc31 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EntityTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EntityTreeItemResponseModel.ts @@ -3,11 +3,11 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; import type { TreeItemPresentationModel } from './TreeItemPresentationModel'; export type EntityTreeItemResponseModel = (TreeItemPresentationModel & { id: string; - isContainer: boolean; - parentId?: string | null; + parent?: ReferenceByIdModel | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ExtractRichTextStylesheetRulesResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ExtractRichTextStylesheetRulesResponseModel.ts deleted file mode 100644 index 0cb17a85ec..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ExtractRichTextStylesheetRulesResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RichTextStylesheetRulesResponseModel } from './RichTextStylesheetRulesResponseModel'; - -export type ExtractRichTextStylesheetRulesResponseModel = RichTextStylesheetRulesResponseModel; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemCreateRequestModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemCreateRequestModelBaseModel.ts new file mode 100644 index 0000000000..68a90eeeb1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemCreateRequestModelBaseModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemFolderModel } from './FileSystemFolderModel'; + +export type FileSystemCreateRequestModelBaseModel = { + name: string; + parent?: FileSystemFolderModel | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileUpdateModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileCreateRequestModelBaseModel.ts similarity index 50% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileUpdateModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileCreateRequestModelBaseModel.ts index e42cf21e00..5b9eb3d4cf 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileUpdateModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileCreateRequestModelBaseModel.ts @@ -3,9 +3,11 @@ /* tslint:disable */ /* eslint-disable */ -export type TextFileUpdateModel = { +import type { FileSystemFolderModel } from './FileSystemFolderModel'; + +export type FileSystemFileCreateRequestModelBaseModel = { name: string; + parent?: FileSystemFolderModel | null; content: string; - existingPath: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileResponseModelBaseModel.ts new file mode 100644 index 0000000000..59c8bb0c08 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileResponseModelBaseModel.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemFolderModel } from './FileSystemFolderModel'; + +export type FileSystemFileResponseModelBaseModel = { + path: string; + name: string; + parent?: FileSystemFolderModel | null; + content: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ExtractRichTextStylesheetRulesRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileUpdateRequestModelBaseModel.ts similarity index 72% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ExtractRichTextStylesheetRulesRequestModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileUpdateRequestModelBaseModel.ts index 25e3f4ce26..44ec79a002 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ExtractRichTextStylesheetRulesRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFileUpdateRequestModelBaseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type ExtractRichTextStylesheetRulesRequestModel = { +export type FileSystemFileUpdateRequestModelBaseModel = { content: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFolderModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFolderModel.ts new file mode 100644 index 0000000000..90964c53e9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFolderModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemItemViewModelBaseModel } from './FileSystemItemViewModelBaseModel'; + +export type FileSystemFolderModel = FileSystemItemViewModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemItemResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemItemResponseModelBaseModel.ts new file mode 100644 index 0000000000..6cc0280bfa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemItemResponseModelBaseModel.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemFolderModel } from './FileSystemFolderModel'; + +export type FileSystemItemResponseModelBaseModel = { + path: string; + name: string; + parent?: FileSystemFolderModel | null; + isFolder: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetOverviewResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemItemViewModelBaseModel.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetOverviewResponseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemItemViewModelBaseModel.ts index c0f0c6d6b0..d0153d4763 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetOverviewResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemItemViewModelBaseModel.ts @@ -3,8 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type StylesheetOverviewResponseModel = { - name: string; +export type FileSystemItemViewModelBaseModel = { path: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SnippetItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemRenameRequestModelBaseModel.ts similarity index 74% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SnippetItemResponseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemRenameRequestModelBaseModel.ts index 147c277f7f..bc4534ef58 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SnippetItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemRenameRequestModelBaseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type SnippetItemResponseModel = { +export type FileSystemRenameRequestModelBaseModel = { name: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemResponseModelBaseModel.ts new file mode 100644 index 0000000000..7d72ab674f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemResponseModelBaseModel.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemFolderModel } from './FileSystemFolderModel'; + +export type FileSystemResponseModelBaseModel = { + path: string; + name: string; + parent?: FileSystemFolderModel | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemTreeItemPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemTreeItemPresentationModel.ts index 37eed57170..00ca2f7dc8 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemTreeItemPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemTreeItemPresentationModel.ts @@ -3,10 +3,13 @@ /* tslint:disable */ /* eslint-disable */ +import type { FileSystemFolderModel } from './FileSystemFolderModel'; import type { TreeItemPresentationModel } from './TreeItemPresentationModel'; export type FileSystemTreeItemPresentationModel = (TreeItemPresentationModel & { + name: string; path: string; + parent?: FileSystemFolderModel | null; isFolder: boolean; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FolderTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FolderTreeItemResponseModel.ts index 5495b5c15e..0d2e87e29c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FolderTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FolderTreeItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { EntityTreeItemResponseModel } from './EntityTreeItemResponseModel'; +import type { NamedEntityTreeItemResponseModel } from './NamedEntityTreeItemResponseModel'; -export type FolderTreeItemResponseModel = (EntityTreeItemResponseModel & { +export type FolderTreeItemResponseModel = (NamedEntityTreeItemResponseModel & { isFolder: boolean; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InterpolateRichTextStylesheetRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InterpolateRichTextStylesheetRequestModel.ts deleted file mode 100644 index 0bdf981a14..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InterpolateRichTextStylesheetRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RichTextRuleModel } from './RichTextRuleModel'; - -export type InterpolateRichTextStylesheetRequestModel = { - content?: string | null; - rules?: Array | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeSortModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemReferenceByIdResponseModel.ts similarity index 71% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeSortModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemReferenceByIdResponseModel.ts index 2ee3edd8a2..94a2eb42bc 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeSortModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemReferenceByIdResponseModel.ts @@ -3,8 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type ContentTypeSortModel = { +export type ItemReferenceByIdResponseModel = { id: string; - sortOrder: number; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemResponseModelBaseModel.ts index 2f97b97f0a..28b7c0e199 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemResponseModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemResponseModelBaseModel.ts @@ -4,7 +4,6 @@ /* eslint-disable */ export type ItemResponseModelBaseModel = { - name: string; id: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaConfigurationResponseModel.ts new file mode 100644 index 0000000000..fbe7b748eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaConfigurationResponseModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type MediaConfigurationResponseModel = { + disableDeleteWhenReferenced: boolean; + disableUnpublishWhenReferenced: boolean; + sanitizeTinyMce: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaItemResponseModel.ts index b1030a7a0c..ec38113736 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaItemResponseModel.ts @@ -4,9 +4,12 @@ /* eslint-disable */ import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { MediaTypeReferenceResponseModel } from './MediaTypeReferenceResponseModel'; +import type { VariantItemResponseModel } from './VariantItemResponseModel'; export type MediaItemResponseModel = (ItemResponseModelBaseModel & { - icon?: string | null; isTrashed: boolean; + mediaType: MediaTypeReferenceResponseModel; + variants: Array; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaRecycleBinItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaRecycleBinItemResponseModel.ts new file mode 100644 index 0000000000..56467ffbc9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaRecycleBinItemResponseModel.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { MediaTypeReferenceResponseModel } from './MediaTypeReferenceResponseModel'; +import type { RecycleBinItemResponseModelBaseModel } from './RecycleBinItemResponseModelBaseModel'; +import type { VariantItemResponseModel } from './VariantItemResponseModel'; + +export type MediaRecycleBinItemResponseModel = (RecycleBinItemResponseModelBaseModel & { + mediaType: MediaTypeReferenceResponseModel; + variants: Array; +}); + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaResponseModel.ts new file mode 100644 index 0000000000..8943019dd2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaResponseModel.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ContentForMediaResponseModel } from './ContentForMediaResponseModel'; +import type { ContentUrlInfoModel } from './ContentUrlInfoModel'; +import type { MediaTypeReferenceResponseModel } from './MediaTypeReferenceResponseModel'; + +export type MediaResponseModel = (ContentForMediaResponseModel & { + urls: Array; + isTrashed: boolean; + mediaType: MediaTypeReferenceResponseModel; +}); + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTreeItemResponseModel.ts index 74864a31b7..24c7fad8f2 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTreeItemResponseModel.ts @@ -4,8 +4,11 @@ /* eslint-disable */ import type { ContentTreeItemResponseModel } from './ContentTreeItemResponseModel'; +import type { MediaTypeReferenceResponseModel } from './MediaTypeReferenceResponseModel'; +import type { VariantItemResponseModel } from './VariantItemResponseModel'; export type MediaTreeItemResponseModel = (ContentTreeItemResponseModel & { - icon: string; + mediaType: MediaTypeReferenceResponseModel; + variants: Array; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionModel.ts new file mode 100644 index 0000000000..26f74e7068 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionModel.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { CompositionTypeModel } from './CompositionTypeModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + +export type MediaTypeCompositionModel = { + mediaType: ReferenceByIdModel; + compositionType: CompositionTypeModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionRequestModel.ts new file mode 100644 index 0000000000..283f523faa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionRequestModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ContentTypeCompositionRequestModelBaseModel } from './ContentTypeCompositionRequestModelBaseModel'; + +export type MediaTypeCompositionRequestModel = ContentTypeCompositionRequestModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionResponseModel.ts new file mode 100644 index 0000000000..3068379d6e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ContentTypeCompositionResponseModelBaseModel } from './ContentTypeCompositionResponseModelBaseModel'; + +export type MediaTypeCompositionResponseModel = ContentTypeCompositionResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeItemResponseModel.ts index 1b76ad894b..782e59631a 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type MediaTypeItemResponseModel = (ItemResponseModelBaseModel & { +export type MediaTypeItemResponseModel = (NamedItemResponseModelBaseModel & { icon?: string | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeReferenceResponseModel.ts new file mode 100644 index 0000000000..5aad862b1b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeReferenceResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ContentTypeReferenceResponseModelBaseModel } from './ContentTypeReferenceResponseModelBaseModel'; + +export type MediaTypeReferenceResponseModel = ContentTypeReferenceResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeResponseModel.ts index 10e0737eab..a4e5cd2e89 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeResponseModel.ts @@ -4,6 +4,11 @@ /* eslint-disable */ import type { ContentTypeForMediaTypeResponseModel } from './ContentTypeForMediaTypeResponseModel'; +import type { MediaTypeCompositionModel } from './MediaTypeCompositionModel'; +import type { MediaTypeSortModel } from './MediaTypeSortModel'; -export type MediaTypeResponseModel = ContentTypeForMediaTypeResponseModel; +export type MediaTypeResponseModel = (ContentTypeForMediaTypeResponseModel & { + allowedMediaTypes: Array; + compositions: Array; +}); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeSortModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeSortModel.ts new file mode 100644 index 0000000000..a6305256c5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeSortModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + +export type MediaTypeSortModel = { + mediaType: ReferenceByIdModel; + sortOrder: number; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupItemResponseModel.ts index 89305e5ea4..690f274951 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type MemberGroupItemResponseModel = ItemResponseModelBaseModel; +export type MemberGroupItemResponseModel = NamedItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberItemResponseModel.ts index f125ad9e47..15607126e2 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type MemberItemResponseModel = (ItemResponseModelBaseModel & { +export type MemberItemResponseModel = (NamedItemResponseModelBaseModel & { icon?: string | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeItemResponseModel.ts index e95ae3bf54..846b1d2159 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type MemberTypeItemResponseModel = (ItemResponseModelBaseModel & { +export type MemberTypeItemResponseModel = (NamedItemResponseModelBaseModel & { icon?: string | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentRequestModel.ts index 5fc4f7d709..0dd9fe3ca0 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentRequestModel.ts @@ -3,7 +3,9 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + export type MoveDocumentRequestModel = { - targetId?: string | null; + target?: ReferenceByIdModel | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentTypeRequestModel.ts new file mode 100644 index 0000000000..b61b053f9d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentTypeRequestModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + +export type MoveDocumentTypeRequestModel = { + target?: ReferenceByIdModel | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaRequestModel.ts index 74c3bdb8a1..caea949b55 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaRequestModel.ts @@ -3,7 +3,9 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + export type MoveMediaRequestModel = { - targetId?: string | null; + target?: ReferenceByIdModel | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaTypeRequestModel.ts new file mode 100644 index 0000000000..d3b5a7c349 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaTypeRequestModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + +export type MoveMediaTypeRequestModel = { + target?: ReferenceByIdModel | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NamedEntityTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NamedEntityTreeItemResponseModel.ts new file mode 100644 index 0000000000..b46ea3126a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NamedEntityTreeItemResponseModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { EntityTreeItemResponseModel } from './EntityTreeItemResponseModel'; + +export type NamedEntityTreeItemResponseModel = (EntityTreeItemResponseModel & { + name: string; +}); + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileViewModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NamedItemResponseModelBaseModel.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileViewModelBaseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NamedItemResponseModelBaseModel.ts index 07e296334a..d7a2882b2c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileViewModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NamedItemResponseModelBaseModel.ts @@ -3,8 +3,8 @@ /* tslint:disable */ /* eslint-disable */ -export type TextFileViewModelBaseModel = { +export type NamedItemResponseModelBaseModel = { + id: string; name: string; - content: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NoopSetupTwoFactorModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NoopSetupTwoFactorModel.ts new file mode 100644 index 0000000000..f3b8fe2761 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NoopSetupTwoFactorModel.ts @@ -0,0 +1,6 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type NoopSetupTwoFactorModel = Record; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageConfigurationResponseModel.ts new file mode 100644 index 0000000000..73634e2f42 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageConfigurationResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type PackageConfigurationResponseModel = { + marketplaceUrl: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedDocumentTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedDocumentTypeModel.ts new file mode 100644 index 0000000000..f0df413068 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedDocumentTypeModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { AllowedDocumentTypeModel } from './AllowedDocumentTypeModel'; + +export type PagedAllowedDocumentTypeModel = { + total: number; + items: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedMediaTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedMediaTypeModel.ts new file mode 100644 index 0000000000..48ca45fd60 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedMediaTypeModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { AllowedMediaTypeModel } from './AllowedMediaTypeModel'; + +export type PagedAllowedMediaTypeModel = { + total: number; + items: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentRecycleBinItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentRecycleBinItemResponseModel.ts new file mode 100644 index 0000000000..1a6958d31f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentRecycleBinItemResponseModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { DocumentRecycleBinItemResponseModel } from './DocumentRecycleBinItemResponseModel'; + +export type PagedDocumentRecycleBinItemResponseModel = { + total: number; + items: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTypeResponseModel.ts deleted file mode 100644 index ca9a43dd71..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTypeResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeResponseModel } from './DocumentTypeResponseModel'; - -export type PagedDocumentTypeResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedEntityTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedEntityTreeItemResponseModel.ts deleted file mode 100644 index 304550a129..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedEntityTreeItemResponseModel.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ContentTreeItemResponseModel } from './ContentTreeItemResponseModel'; -import type { DataTypeTreeItemResponseModel } from './DataTypeTreeItemResponseModel'; -import type { DocumentBlueprintTreeItemResponseModel } from './DocumentBlueprintTreeItemResponseModel'; -import type { DocumentTreeItemResponseModel } from './DocumentTreeItemResponseModel'; -import type { DocumentTypeTreeItemResponseModel } from './DocumentTypeTreeItemResponseModel'; -import type { EntityTreeItemResponseModel } from './EntityTreeItemResponseModel'; -import type { FolderTreeItemResponseModel } from './FolderTreeItemResponseModel'; -import type { MediaTreeItemResponseModel } from './MediaTreeItemResponseModel'; -import type { MediaTypeTreeItemResponseModel } from './MediaTypeTreeItemResponseModel'; - -export type PagedEntityTreeItemResponseModel = { - total: number; - items: Array<(EntityTreeItemResponseModel | ContentTreeItemResponseModel | DataTypeTreeItemResponseModel | DocumentBlueprintTreeItemResponseModel | DocumentTreeItemResponseModel | DocumentTypeTreeItemResponseModel | FolderTreeItemResponseModel | MediaTreeItemResponseModel | MediaTypeTreeItemResponseModel)>; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaRecycleBinItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaRecycleBinItemResponseModel.ts new file mode 100644 index 0000000000..1918188011 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaRecycleBinItemResponseModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { MediaRecycleBinItemResponseModel } from './MediaRecycleBinItemResponseModel'; + +export type PagedMediaRecycleBinItemResponseModel = { + total: number; + items: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedNamedEntityTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedNamedEntityTreeItemResponseModel.ts new file mode 100644 index 0000000000..8af4c598e0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedNamedEntityTreeItemResponseModel.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { DataTypeTreeItemResponseModel } from './DataTypeTreeItemResponseModel'; +import type { DocumentBlueprintTreeItemResponseModel } from './DocumentBlueprintTreeItemResponseModel'; +import type { DocumentTypeTreeItemResponseModel } from './DocumentTypeTreeItemResponseModel'; +import type { FolderTreeItemResponseModel } from './FolderTreeItemResponseModel'; +import type { MediaTypeTreeItemResponseModel } from './MediaTypeTreeItemResponseModel'; +import type { NamedEntityTreeItemResponseModel } from './NamedEntityTreeItemResponseModel'; + +export type PagedNamedEntityTreeItemResponseModel = { + total: number; + items: Array<(NamedEntityTreeItemResponseModel | DataTypeTreeItemResponseModel | DocumentBlueprintTreeItemResponseModel | DocumentTypeTreeItemResponseModel | FolderTreeItemResponseModel | MediaTypeTreeItemResponseModel)>; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPartialViewSnippetItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPartialViewSnippetItemResponseModel.ts new file mode 100644 index 0000000000..0c0746288c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPartialViewSnippetItemResponseModel.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { PartialViewSnippetItemResponseModel } from './PartialViewSnippetItemResponseModel'; +import type { PartialViewSnippetResponseModel } from './PartialViewSnippetResponseModel'; + +export type PagedPartialViewSnippetItemResponseModel = { + total: number; + items: Array<(PartialViewSnippetItemResponseModel | PartialViewSnippetResponseModel)>; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRecycleBinItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRecycleBinItemResponseModel.ts deleted file mode 100644 index 3d30d30c21..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRecycleBinItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RecycleBinItemResponseModel } from './RecycleBinItemResponseModel'; - -export type PagedRecycleBinItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSnippetItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSnippetItemResponseModel.ts deleted file mode 100644 index 5071ba2259..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSnippetItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { SnippetItemResponseModel } from './SnippetItemResponseModel'; - -export type PagedSnippetItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedStylesheetOverviewResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedStylesheetOverviewResponseModel.ts deleted file mode 100644 index 72d0259304..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedStylesheetOverviewResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { StylesheetOverviewResponseModel } from './StylesheetOverviewResponseModel'; - -export type PagedStylesheetOverviewResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewFolderResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewFolderResponseModel.ts new file mode 100644 index 0000000000..b43f9b3618 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewFolderResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemResponseModelBaseModel } from './FileSystemResponseModelBaseModel'; + +export type PartialViewFolderResponseModel = FileSystemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewItemResponseModel.ts index 7fdfdf7b12..0e02db6975 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { FileItemResponseModelBaseModel } from './FileItemResponseModelBaseModel'; +import type { FileSystemItemResponseModelBaseModel } from './FileSystemItemResponseModelBaseModel'; -export type PartialViewItemResponseModel = FileItemResponseModelBaseModel; +export type PartialViewItemResponseModel = FileSystemItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewResponseModel.ts index 78794defbf..1918d146c2 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { TextFileResponseModelBaseModel } from './TextFileResponseModelBaseModel'; +import type { FileSystemFileResponseModelBaseModel } from './FileSystemFileResponseModelBaseModel'; -export type PartialViewResponseModel = TextFileResponseModelBaseModel; +export type PartialViewResponseModel = FileSystemFileResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetItemResponseModel.ts new file mode 100644 index 0000000000..0e4707e702 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetItemResponseModel.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type PartialViewSnippetItemResponseModel = { + id: string; + name: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetResponseModel.ts index 3cb2ce5604..5937fb3414 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetResponseModel.ts @@ -3,8 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -export type PartialViewSnippetResponseModel = { - name: string; - content: string; -}; +import type { PartialViewSnippetItemResponseModel } from './PartialViewSnippetItemResponseModel'; + +export type PartialViewSnippetResponseModel = (PartialViewSnippetItemResponseModel & { + content: string; +}); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PasswordConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PasswordConfigurationResponseModel.ts new file mode 100644 index 0000000000..090f5de3c9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PasswordConfigurationResponseModel.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type PasswordConfigurationResponseModel = { + minimumPasswordLength: number; + requireNonLetterOrDigit: boolean; + requireDigit: boolean; + requireLowercase: boolean; + requireUppercase: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PathFolderModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PathFolderModelBaseModel.ts deleted file mode 100644 index 34f3798e95..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PathFolderModelBaseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FolderModelBaseModel } from './FolderModelBaseModel'; - -export type PathFolderModelBaseModel = FolderModelBaseModel; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PathFolderResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PathFolderResponseModel.ts deleted file mode 100644 index 9d9a70d33a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PathFolderResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FolderModelBaseModel } from './FolderModelBaseModel'; - -export type PathFolderResponseModel = (FolderModelBaseModel & { - parentPath?: string | null; - readonly path: string; -}); - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeContainerModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeContainerModelBaseModel.ts index 0e666d72e2..6009b9eefb 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeContainerModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeContainerModelBaseModel.ts @@ -3,9 +3,11 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + export type PropertyTypeContainerModelBaseModel = { id: string; - parentId?: string | null; + parent?: ReferenceByIdModel | null; name?: string | null; type: string; sortOrder: number; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeModelBaseModel.ts index 7c6378302e..46d414389d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeModelBaseModel.ts @@ -5,15 +5,16 @@ import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type PropertyTypeModelBaseModel = { id: string; - containerId?: string | null; + container?: ReferenceByIdModel | null; sortOrder: number; alias: string; name: string; description?: string | null; - dataTypeId: string; + dataType: ReferenceByIdModel; variesByCulture: boolean; variesBySegment: boolean; validation: PropertyTypeValidationModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishedStateModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishedStateModel.ts deleted file mode 100644 index 30b0c07b45..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishedStateModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum PublishedStateModel { - PUBLISHED = 'Published', - UNPUBLISHED = 'Unpublished', - PUBLISHING = 'Publishing', - UNPUBLISHING = 'Unpublishing', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RecycleBinItemResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RecycleBinItemResponseModelBaseModel.ts new file mode 100644 index 0000000000..2666184305 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RecycleBinItemResponseModelBaseModel.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemReferenceByIdResponseModel } from './ItemReferenceByIdResponseModel'; + +export type RecycleBinItemResponseModelBaseModel = { + id: string; + type: string; + hasChildren: boolean; + parent?: ItemReferenceByIdResponseModel | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VersionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ReferenceByIdModel.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VersionResponseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ReferenceByIdModel.ts index 401d665ba3..5085db2e12 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VersionResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ReferenceByIdModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type VersionResponseModel = { - version: string; +export type ReferenceByIdModel = { + id: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeItemResponseModel.ts index f3e21f18af..f156f0987d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type RelationTypeItemResponseModel = ItemResponseModelBaseModel; +export type RelationTypeItemResponseModel = NamedItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenamePartialViewRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenamePartialViewRequestModel.ts new file mode 100644 index 0000000000..73d12f36fb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenamePartialViewRequestModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemRenameRequestModelBaseModel } from './FileSystemRenameRequestModelBaseModel'; + +export type RenamePartialViewRequestModel = FileSystemRenameRequestModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameScriptRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameScriptRequestModel.ts new file mode 100644 index 0000000000..cb578affc0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameScriptRequestModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemRenameRequestModelBaseModel } from './FileSystemRenameRequestModelBaseModel'; + +export type RenameScriptRequestModel = FileSystemRenameRequestModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameStylesheetRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameStylesheetRequestModel.ts new file mode 100644 index 0000000000..6af9564ff7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameStylesheetRequestModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemRenameRequestModelBaseModel } from './FileSystemRenameRequestModelBaseModel'; + +export type RenameStylesheetRequestModel = FileSystemRenameRequestModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RichTextStylesheetRulesResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RichTextStylesheetRulesResponseModel.ts deleted file mode 100644 index a9d1dab40d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RichTextStylesheetRulesResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RichTextRuleModel } from './RichTextRuleModel'; - -export type RichTextStylesheetRulesResponseModel = { - rules: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeModeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeModeModel.ts new file mode 100644 index 0000000000..0f8e601e95 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeModeModel.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export enum RuntimeModeModel { + BACKOFFICE_DEVELOPMENT = 'BackofficeDevelopment', + DEVELOPMENT = 'Development', + PRODUCTION = 'Production', +} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptFolderResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptFolderResponseModel.ts new file mode 100644 index 0000000000..c1c41eee88 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptFolderResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemResponseModelBaseModel } from './FileSystemResponseModelBaseModel'; + +export type ScriptFolderResponseModel = FileSystemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptItemResponseModel.ts index 0ab2f9278e..714d81db7d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { FileItemResponseModelBaseModel } from './FileItemResponseModelBaseModel'; +import type { FileSystemItemResponseModelBaseModel } from './FileSystemItemResponseModelBaseModel'; -export type ScriptItemResponseModel = FileItemResponseModelBaseModel; +export type ScriptItemResponseModel = FileSystemItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptResponseModel.ts index d62215f214..789b07ca28 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { TextFileResponseModelBaseModel } from './TextFileResponseModelBaseModel'; +import type { FileSystemFileResponseModelBaseModel } from './FileSystemFileResponseModelBaseModel'; -export type ScriptResponseModel = TextFileResponseModelBaseModel; +export type ScriptResponseModel = FileSystemFileResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptUpdateModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptUpdateModel.ts deleted file mode 100644 index 8084a2a9c2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptUpdateModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TextFileUpdateModel } from './TextFileUpdateModel'; - -export type ScriptUpdateModel = TextFileUpdateModel; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptViewModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptViewModelBaseModel.ts deleted file mode 100644 index 2cb3519a37..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptViewModelBaseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TextFileViewModelBaseModel } from './TextFileViewModelBaseModel'; - -export type ScriptViewModelBaseModel = TextFileViewModelBaseModel; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SecurityConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SecurityConfigurationResponseModel.ts new file mode 100644 index 0000000000..560327a3a7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SecurityConfigurationResponseModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { PasswordConfigurationResponseModel } from './PasswordConfigurationResponseModel'; + +export type SecurityConfigurationResponseModel = { + passwordConfiguration: PasswordConfigurationResponseModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationBaseModel.ts new file mode 100644 index 0000000000..0192f50c80 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationBaseModel.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ServerConfigurationItemResponseModel } from './ServerConfigurationItemResponseModel'; + +export type ServerConfigurationBaseModel = { + items: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationItemResponseModel.ts similarity index 76% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationItemResponseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationItemResponseModel.ts index 1e3278bd97..4e97e60583 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type ServerInformationItemResponseModel = { +export type ServerConfigurationItemResponseModel = { name: string; data: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationResponseModel.ts new file mode 100644 index 0000000000..98eb5b3d0b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ServerConfigurationResponseModel = { + allowPasswordReset: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationResponseModel.ts index 27ec2ff0a9..3625d63958 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationResponseModel.ts @@ -3,9 +3,12 @@ /* tslint:disable */ /* eslint-disable */ -import type { ServerInformationItemResponseModel } from './ServerInformationItemResponseModel'; +import type { RuntimeModeModel } from './RuntimeModeModel'; export type ServerInformationResponseModel = { - items: Array; + version: string; + assemblyVersion: string; + baseUtcOffset: string; + runtimeMode: RuntimeModeModel; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerTroubleshootingResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerTroubleshootingResponseModel.ts new file mode 100644 index 0000000000..f46e4202ff --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerTroubleshootingResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ServerConfigurationBaseModel } from './ServerConfigurationBaseModel'; + +export type ServerTroubleshootingResponseModel = ServerConfigurationBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StaticFileItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StaticFileItemResponseModel.ts index 0d8eb68349..2ad2984074 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StaticFileItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StaticFileItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { FileItemResponseModelBaseModel } from './FileItemResponseModelBaseModel'; +import type { FileSystemItemResponseModelBaseModel } from './FileSystemItemResponseModelBaseModel'; -export type StaticFileItemResponseModel = FileItemResponseModelBaseModel; +export type StaticFileItemResponseModel = FileSystemItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetFolderResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetFolderResponseModel.ts new file mode 100644 index 0000000000..3c0fda4061 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetFolderResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileSystemResponseModelBaseModel } from './FileSystemResponseModelBaseModel'; + +export type StylesheetFolderResponseModel = FileSystemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetItemResponseModel.ts index ef0de320f1..c4b7d817c6 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { FileItemResponseModelBaseModel } from './FileItemResponseModelBaseModel'; +import type { FileSystemItemResponseModelBaseModel } from './FileSystemItemResponseModelBaseModel'; -export type StylesheetItemResponseModel = FileItemResponseModelBaseModel; +export type StylesheetItemResponseModel = FileSystemItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetResponseModel.ts index 38583b9dc2..e32e8f2d74 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { TextFileResponseModelBaseModel } from './TextFileResponseModelBaseModel'; +import type { FileSystemFileResponseModelBaseModel } from './FileSystemFileResponseModelBaseModel'; -export type StylesheetResponseModel = TextFileResponseModelBaseModel; +export type StylesheetResponseModel = FileSystemFileResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetUpdateModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetUpdateModel.ts deleted file mode 100644 index 046d3a855b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetUpdateModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TextFileUpdateModel } from './TextFileUpdateModel'; - -export type StylesheetUpdateModel = TextFileUpdateModel; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateConfigurationResponseModel.ts new file mode 100644 index 0000000000..1236e86306 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateConfigurationResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type TemplateConfigurationResponseModel = { + disabled: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateItemResponseModel.ts index 16835bc83b..dc6a62ed51 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type TemplateItemResponseModel = (ItemResponseModelBaseModel & { +export type TemplateItemResponseModel = (NamedItemResponseModelBaseModel & { alias: string; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileResponseModelBaseModel.ts deleted file mode 100644 index 7291053253..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TextFileResponseModelBaseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TextFileViewModelBaseModel } from './TextFileViewModelBaseModel'; - -export type TextFileResponseModelBaseModel = (TextFileViewModelBaseModel & { - path: string; -}); - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TreeItemPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TreeItemPresentationModel.ts index e0ee22db66..b6e40540ce 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TreeItemPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TreeItemPresentationModel.ts @@ -4,7 +4,6 @@ /* eslint-disable */ export type TreeItemPresentationModel = { - name: string; type: string; hasChildren: boolean; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForDocumentTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForDocumentTypeRequestModel.ts index 09864a6fc2..752409e225 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForDocumentTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForDocumentTypeRequestModel.ts @@ -3,8 +3,6 @@ /* tslint:disable */ /* eslint-disable */ -import type { ContentTypeCompositionModel } from './ContentTypeCompositionModel'; -import type { ContentTypeSortModel } from './ContentTypeSortModel'; import type { UpdateDocumentTypePropertyTypeContainerRequestModel } from './UpdateDocumentTypePropertyTypeContainerRequestModel'; import type { UpdateDocumentTypePropertyTypeRequestModel } from './UpdateDocumentTypePropertyTypeRequestModel'; @@ -19,7 +17,5 @@ export type UpdateContentTypeForDocumentTypeRequestModel = { isElement: boolean; properties: Array; containers: Array; - allowedContentTypes: Array; - compositions: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMediaTypeRequestModel.ts index cb56a11e5b..40e766fdcc 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMediaTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMediaTypeRequestModel.ts @@ -3,8 +3,6 @@ /* tslint:disable */ /* eslint-disable */ -import type { ContentTypeCompositionModel } from './ContentTypeCompositionModel'; -import type { ContentTypeSortModel } from './ContentTypeSortModel'; import type { UpdateMediaTypePropertyTypeContainerRequestModel } from './UpdateMediaTypePropertyTypeContainerRequestModel'; import type { UpdateMediaTypePropertyTypeRequestModel } from './UpdateMediaTypePropertyTypeRequestModel'; @@ -19,7 +17,5 @@ export type UpdateContentTypeForMediaTypeRequestModel = { isElement: boolean; properties: Array; containers: Array; - allowedContentTypes: Array; - compositions: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentRequestModel.ts index 27ff9ea8b3..75b04656c5 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentRequestModel.ts @@ -3,9 +3,10 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; import type { UpdateContentForDocumentRequestModel } from './UpdateContentForDocumentRequestModel'; export type UpdateDocumentRequestModel = (UpdateContentForDocumentRequestModel & { - templateId?: string | null; + template?: ReferenceByIdModel | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypeRequestModel.ts index 9bb31a94f1..100ddcc421 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypeRequestModel.ts @@ -4,11 +4,16 @@ /* eslint-disable */ import type { ContentTypeCleanupModel } from './ContentTypeCleanupModel'; +import type { DocumentTypeCompositionModel } from './DocumentTypeCompositionModel'; +import type { DocumentTypeSortModel } from './DocumentTypeSortModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; import type { UpdateContentTypeForDocumentTypeRequestModel } from './UpdateContentTypeForDocumentTypeRequestModel'; export type UpdateDocumentTypeRequestModel = (UpdateContentTypeForDocumentTypeRequestModel & { - allowedTemplateIds: Array; - defaultTemplateId?: string | null; + allowedTemplates: Array; + defaultTemplate?: ReferenceByIdModel | null; cleanup: ContentTypeCleanupModel; + allowedDocumentTypes: Array; + compositions: Array; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypeRequestModel.ts index 38b1fe4ea3..25341fe97d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypeRequestModel.ts @@ -3,7 +3,12 @@ /* tslint:disable */ /* eslint-disable */ +import type { MediaTypeCompositionModel } from './MediaTypeCompositionModel'; +import type { MediaTypeSortModel } from './MediaTypeSortModel'; import type { UpdateContentTypeForMediaTypeRequestModel } from './UpdateContentTypeForMediaTypeRequestModel'; -export type UpdateMediaTypeRequestModel = UpdateContentTypeForMediaTypeRequestModel; +export type UpdateMediaTypeRequestModel = (UpdateContentTypeForMediaTypeRequestModel & { + allowedMediaTypes: Array; + compositions: Array; +}); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePartialViewRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePartialViewRequestModel.ts index 4bd4445290..74425b5145 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePartialViewRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePartialViewRequestModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { TextFileUpdateModel } from './TextFileUpdateModel'; +import type { FileSystemFileUpdateRequestModelBaseModel } from './FileSystemFileUpdateRequestModelBaseModel'; -export type UpdatePartialViewRequestModel = TextFileUpdateModel; +export type UpdatePartialViewRequestModel = FileSystemFileUpdateRequestModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateScriptRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateScriptRequestModel.ts index a5f1657830..64b5dd28d1 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateScriptRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateScriptRequestModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { UpdateTextFileViewModelBaseModel } from './UpdateTextFileViewModelBaseModel'; +import type { FileSystemFileUpdateRequestModelBaseModel } from './FileSystemFileUpdateRequestModelBaseModel'; -export type UpdateScriptRequestModel = UpdateTextFileViewModelBaseModel; +export type UpdateScriptRequestModel = FileSystemFileUpdateRequestModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateStylesheetRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateStylesheetRequestModel.ts index 097988d56d..06dd317e1f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateStylesheetRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateStylesheetRequestModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { UpdateTextFileViewModelBaseModel } from './UpdateTextFileViewModelBaseModel'; +import type { FileSystemFileUpdateRequestModelBaseModel } from './FileSystemFileUpdateRequestModelBaseModel'; -export type UpdateStylesheetRequestModel = UpdateTextFileViewModelBaseModel; +export type UpdateStylesheetRequestModel = FileSystemFileUpdateRequestModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateTextFileViewModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateTextFileViewModelBaseModel.ts deleted file mode 100644 index 05179949e4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateTextFileViewModelBaseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TextFileViewModelBaseModel } from './TextFileViewModelBaseModel'; - -export type UpdateTextFileViewModelBaseModel = (TextFileViewModelBaseModel & { - existingPath: string; -}); - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserConfigurationResponseModel.ts new file mode 100644 index 0000000000..03b2a5c612 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserConfigurationResponseModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { PasswordConfigurationResponseModel } from './PasswordConfigurationResponseModel'; + +export type UserConfigurationResponseModel = { + canInviteUsers: boolean; + passwordConfiguration: PasswordConfigurationResponseModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupItemResponseModel.ts index 5a982ed54f..8ded3fdf6e 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupItemResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type UserGroupItemResponseModel = (ItemResponseModelBaseModel & { +export type UserGroupItemResponseModel = (NamedItemResponseModelBaseModel & { icon?: string | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserItemResponseModel.ts index b8d26aa52d..fbe9a652d8 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserItemResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; +import type { NamedItemResponseModelBaseModel } from './NamedItemResponseModelBaseModel'; -export type UserItemResponseModel = ItemResponseModelBaseModel; +export type UserItemResponseModel = NamedItemResponseModelBaseModel; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTwoFactorProviderModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTwoFactorProviderModel.ts new file mode 100644 index 0000000000..be0c9fc780 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTwoFactorProviderModel.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type UserTwoFactorProviderModel = { + providerName: string; + isEnabledOnUser: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantItemResponseModel.ts new file mode 100644 index 0000000000..803621a39c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantItemResponseModel.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { VariantItemResponseModelBaseModel } from './VariantItemResponseModelBaseModel'; + +export type VariantItemResponseModel = VariantItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RichTextRuleModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantItemResponseModelBaseModel.ts similarity index 66% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RichTextRuleModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantItemResponseModelBaseModel.ts index 027022daab..955c49c60c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RichTextRuleModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantItemResponseModelBaseModel.ts @@ -3,9 +3,8 @@ /* tslint:disable */ /* eslint-disable */ -export type RichTextRuleModel = { +export type VariantItemResponseModelBaseModel = { name: string; - selector: string; - styles: string; + culture?: string | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DataTypeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DataTypeResource.ts index 9bf3aa8360..f4fb9f85a5 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DataTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DataTypeResource.ts @@ -5,6 +5,7 @@ import type { CopyDataTypeRequestModel } from '../models/CopyDataTypeRequestModel'; import type { CreateDataTypeRequestModel } from '../models/CreateDataTypeRequestModel'; import type { CreateFolderRequestModel } from '../models/CreateFolderRequestModel'; +import type { DatatypeConfigurationResponseModel } from '../models/DatatypeConfigurationResponseModel'; import type { DataTypeItemResponseModel } from '../models/DataTypeItemResponseModel'; import type { DataTypeReferenceResponseModel } from '../models/DataTypeReferenceResponseModel'; import type { DataTypeResponseModel } from '../models/DataTypeResponseModel'; @@ -34,7 +35,7 @@ export class DataTypeResource { url: '/umbraco/management/api/v1/data-type', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, @@ -134,7 +135,7 @@ export class DataTypeResource { }, body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 401: `The resource is protected and requires an authentication token`, 404: `Not Found`, @@ -168,7 +169,7 @@ export class DataTypeResource { * @returns any Success * @throws ApiError */ - public static postDataTypeByIdMove({ + public static putDataTypeByIdMove({ id, requestBody, }: { @@ -176,7 +177,7 @@ export class DataTypeResource { requestBody?: MoveDataTypeRequestModel, }): CancelablePromise { return __request(OpenAPI, { - method: 'POST', + method: 'PUT', url: '/umbraco/management/api/v1/data-type/{id}/move', path: { 'id': id, @@ -212,6 +213,20 @@ export class DataTypeResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getDataTypeConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/data-type/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns string Created * @throws ApiError @@ -226,7 +241,7 @@ export class DataTypeResource { url: '/umbraco/management/api/v1/data-type/folder', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DictionaryResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DictionaryResource.ts index 1d32c33e6d..fc9a4bc384 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DictionaryResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DictionaryResource.ts @@ -8,7 +8,7 @@ import type { DictionaryItemResponseModel } from '../models/DictionaryItemRespon import type { ImportDictionaryRequestModel } from '../models/ImportDictionaryRequestModel'; import type { MoveDictionaryRequestModel } from '../models/MoveDictionaryRequestModel'; import type { PagedDictionaryOverviewResponseModel } from '../models/PagedDictionaryOverviewResponseModel'; -import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; +import type { PagedNamedEntityTreeItemResponseModel } from '../models/PagedNamedEntityTreeItemResponseModel'; import type { UpdateDictionaryItemRequestModel } from '../models/UpdateDictionaryItemRequestModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -55,10 +55,11 @@ export class DictionaryResource { url: '/umbraco/management/api/v1/dictionary', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, 404: `Not Found`, 409: `Conflict`, }, @@ -132,6 +133,7 @@ export class DictionaryResource { errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, 404: `Not Found`, }, }); @@ -168,7 +170,7 @@ export class DictionaryResource { * @returns any Success * @throws ApiError */ - public static postDictionaryByIdMove({ + public static putDictionaryByIdMove({ id, requestBody, }: { @@ -176,7 +178,7 @@ export class DictionaryResource { requestBody?: MoveDictionaryRequestModel, }): CancelablePromise { return __request(OpenAPI, { - method: 'POST', + method: 'PUT', url: '/umbraco/management/api/v1/dictionary/{id}/move', path: { 'id': id, @@ -205,7 +207,7 @@ export class DictionaryResource { url: '/umbraco/management/api/v1/dictionary/import', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, @@ -236,7 +238,7 @@ export class DictionaryResource { } /** - * @returns PagedEntityTreeItemResponseModel Success + * @returns PagedNamedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeDictionaryChildren({ @@ -247,7 +249,7 @@ export class DictionaryResource { parentId?: string, skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/dictionary/children', @@ -263,7 +265,7 @@ export class DictionaryResource { } /** - * @returns PagedEntityTreeItemResponseModel Success + * @returns PagedNamedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeDictionaryRoot({ @@ -272,7 +274,7 @@ export class DictionaryResource { }: { skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/dictionary/root', diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts index 19d3171ea0..02787a6afd 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts @@ -4,14 +4,14 @@ /* eslint-disable */ import type { CopyDocumentRequestModel } from '../models/CopyDocumentRequestModel'; import type { CreateDocumentRequestModel } from '../models/CreateDocumentRequestModel'; +import type { DocumentConfigurationResponseModel } from '../models/DocumentConfigurationResponseModel'; import type { DocumentItemResponseModel } from '../models/DocumentItemResponseModel'; import type { DocumentNotificationResponseModel } from '../models/DocumentNotificationResponseModel'; import type { DocumentResponseModel } from '../models/DocumentResponseModel'; import type { DomainsResponseModel } from '../models/DomainsResponseModel'; import type { MoveDocumentRequestModel } from '../models/MoveDocumentRequestModel'; +import type { PagedDocumentRecycleBinItemResponseModel } from '../models/PagedDocumentRecycleBinItemResponseModel'; import type { PagedDocumentTreeItemResponseModel } from '../models/PagedDocumentTreeItemResponseModel'; -import type { PagedDocumentTypeResponseModel } from '../models/PagedDocumentTypeResponseModel'; -import type { PagedRecycleBinItemResponseModel } from '../models/PagedRecycleBinItemResponseModel'; import type { PublicAccessRequestModel } from '../models/PublicAccessRequestModel'; import type { PublishDocumentRequestModel } from '../models/PublishDocumentRequestModel'; import type { PublishDocumentWithDescendantsRequestModel } from '../models/PublishDocumentWithDescendantsRequestModel'; @@ -41,7 +41,7 @@ export class DocumentResource { url: '/umbraco/management/api/v1/document', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 401: `The resource is protected and requires an authentication token`, 403: `The authenticated user do not have access to this resource`, @@ -73,6 +73,30 @@ export class DocumentResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static deleteDocumentById({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/document/{id}', + path: { + 'id': id, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + /** * @returns any Success * @throws ApiError @@ -119,7 +143,7 @@ export class DocumentResource { }, body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 401: `The resource is protected and requires an authentication token`, 403: `The authenticated user do not have access to this resource`, @@ -294,7 +318,7 @@ export class DocumentResource { }, body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 401: `The resource is protected and requires an authentication token`, 403: `The authenticated user do not have access to this resource`, @@ -461,29 +485,15 @@ export class DocumentResource { } /** - * @returns PagedDocumentTypeResponseModel Success + * @returns any Success * @throws ApiError */ - public static getDocumentAllowedDocumentTypes({ - parentId, - skip, - take = 100, - }: { - parentId?: string, - skip?: number, - take?: number, - }): CancelablePromise { + public static getDocumentConfiguration(): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document/allowed-document-types', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - }, + url: '/umbraco/management/api/v1/document/configuration', errors: { 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, }, }); } @@ -494,20 +504,14 @@ export class DocumentResource { */ public static getDocumentItem({ id, - dataTypeId, - culture, }: { id?: Array, - dataTypeId?: string, - culture?: string, }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/document/item', query: { 'id': id, - 'dataTypeId': dataTypeId, - 'culture': culture, }, errors: { 401: `The resource is protected and requires an authentication token`, @@ -539,7 +543,47 @@ export class DocumentResource { } /** - * @returns PagedRecycleBinItemResponseModel Success + * @returns any Success + * @throws ApiError + */ + public static deleteRecycleBinDocument(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/document', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteRecycleBinDocumentById({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}', + path: { + 'id': id, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns PagedDocumentRecycleBinItemResponseModel Success * @throws ApiError */ public static getRecycleBinDocumentChildren({ @@ -550,7 +594,7 @@ export class DocumentResource { parentId?: string, skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/recycle-bin/document/children', @@ -566,7 +610,7 @@ export class DocumentResource { } /** - * @returns PagedRecycleBinItemResponseModel Success + * @returns PagedDocumentRecycleBinItemResponseModel Success * @throws ApiError */ public static getRecycleBinDocumentRoot({ @@ -575,7 +619,7 @@ export class DocumentResource { }: { skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/recycle-bin/document/root', @@ -598,13 +642,11 @@ export class DocumentResource { skip, take = 100, dataTypeId, - culture, }: { parentId?: string, skip?: number, take?: number, dataTypeId?: string, - culture?: string, }): CancelablePromise { return __request(OpenAPI, { method: 'GET', @@ -614,7 +656,6 @@ export class DocumentResource { 'skip': skip, 'take': take, 'dataTypeId': dataTypeId, - 'culture': culture, }, errors: { 401: `The resource is protected and requires an authentication token`, @@ -630,12 +671,10 @@ export class DocumentResource { skip, take = 100, dataTypeId, - culture, }: { skip?: number, take?: number, dataTypeId?: string, - culture?: string, }): CancelablePromise { return __request(OpenAPI, { method: 'GET', @@ -644,7 +683,6 @@ export class DocumentResource { 'skip': skip, 'take': take, 'dataTypeId': dataTypeId, - 'culture': culture, }, errors: { 401: `The resource is protected and requires an authentication token`, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentTypeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentTypeResource.ts index c0720a7845..2c82079ef4 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentTypeResource.ts @@ -2,11 +2,18 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { AvailableDocumentTypeCompositionResponseModel } from '../models/AvailableDocumentTypeCompositionResponseModel'; +import type { CopyDocumentTypeRequestModel } from '../models/CopyDocumentTypeRequestModel'; import type { CreateDocumentTypeRequestModel } from '../models/CreateDocumentTypeRequestModel'; import type { CreateFolderRequestModel } from '../models/CreateFolderRequestModel'; +import type { DocumentTypeCompositionRequestModel } from '../models/DocumentTypeCompositionRequestModel'; +import type { DocumentTypeCompositionResponseModel } from '../models/DocumentTypeCompositionResponseModel'; +import type { DocumentTypeConfigurationResponseModel } from '../models/DocumentTypeConfigurationResponseModel'; import type { DocumentTypeItemResponseModel } from '../models/DocumentTypeItemResponseModel'; import type { DocumentTypeResponseModel } from '../models/DocumentTypeResponseModel'; import type { FolderResponseModel } from '../models/FolderResponseModel'; +import type { MoveDocumentTypeRequestModel } from '../models/MoveDocumentTypeRequestModel'; +import type { PagedAllowedDocumentTypeModel } from '../models/PagedAllowedDocumentTypeModel'; import type { PagedDocumentTypeTreeItemResponseModel } from '../models/PagedDocumentTypeTreeItemResponseModel'; import type { UpdateDocumentTypeRequestModel } from '../models/UpdateDocumentTypeRequestModel'; import type { UpdateFolderResponseModel } from '../models/UpdateFolderResponseModel'; @@ -31,7 +38,7 @@ export class DocumentTypeResource { url: '/umbraco/management/api/v1/document-type', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, @@ -111,6 +118,172 @@ export class DocumentTypeResource { }); } + /** + * @returns PagedAllowedDocumentTypeModel Success + * @throws ApiError + */ + public static getDocumentTypeByIdAllowedChildren({ + id, + skip, + take = 100, + }: { + id: string, + skip?: number, + take?: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}/allowed-children', + path: { + 'id': id, + }, + query: { + 'skip': skip, + 'take': take, + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getDocumentTypeByIdCompositionReferences({ + id, + }: { + id: string, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}/composition-references', + path: { + 'id': id, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postDocumentTypeByIdCopy({ + id, + requestBody, + }: { + id: string, + requestBody?: CopyDocumentTypeRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-type/{id}/copy', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putDocumentTypeByIdMove({ + id, + requestBody, + }: { + id: string, + requestBody?: MoveDocumentTypeRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document-type/{id}/move', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns PagedAllowedDocumentTypeModel Success + * @throws ApiError + */ + public static getDocumentTypeAllowedAtRoot({ + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/allowed-at-root', + query: { + 'skip': skip, + 'take': take, + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postDocumentTypeAvailableCompositions({ + requestBody, + }: { + requestBody?: DocumentTypeCompositionRequestModel, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-type/available-compositions', + body: requestBody, + mediaType: 'application/json', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getDocumentTypeConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns string Created * @throws ApiError @@ -125,7 +298,7 @@ export class DocumentTypeResource { url: '/umbraco/management/api/v1/document-type/folder', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DynamicRootResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DynamicRootResource.ts new file mode 100644 index 0000000000..8b91f9bf26 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DynamicRootResource.ts @@ -0,0 +1,48 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { DynamicRootRequestModel } from '../models/DynamicRootRequestModel'; +import type { DynamicRootResponseModel } from '../models/DynamicRootResponseModel'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class DynamicRootResource { + + /** + * @returns any Success + * @throws ApiError + */ + public static postDynamicRootQuery({ + requestBody, + }: { + requestBody?: DynamicRootRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/dynamic-root/query', + body: requestBody, + mediaType: 'application/json', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static getDynamicRootSteps(): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/dynamic-root/steps', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LanguageResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LanguageResource.ts index 50b9fcc55d..5125a1feba 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LanguageResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LanguageResource.ts @@ -52,7 +52,7 @@ export class LanguageResource { url: '/umbraco/management/api/v1/language', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LogViewerResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LogViewerResource.ts index 875f6ddd01..136e84a465 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LogViewerResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LogViewerResource.ts @@ -175,7 +175,7 @@ export class LogViewerResource { url: '/umbraco/management/api/v1/log-viewer/saved-search', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts index 300cf01e33..2fe94bcc8c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts @@ -3,12 +3,12 @@ /* tslint:disable */ /* eslint-disable */ import type { CreateMediaRequestModel } from '../models/CreateMediaRequestModel'; -import type { DocumentResponseModel } from '../models/DocumentResponseModel'; +import type { MediaConfigurationResponseModel } from '../models/MediaConfigurationResponseModel'; import type { MediaItemResponseModel } from '../models/MediaItemResponseModel'; -import type { MediaTreeItemResponseModel } from '../models/MediaTreeItemResponseModel'; +import type { MediaResponseModel } from '../models/MediaResponseModel'; import type { MoveMediaRequestModel } from '../models/MoveMediaRequestModel'; +import type { PagedMediaRecycleBinItemResponseModel } from '../models/PagedMediaRecycleBinItemResponseModel'; import type { PagedMediaTreeItemResponseModel } from '../models/PagedMediaTreeItemResponseModel'; -import type { PagedRecycleBinItemResponseModel } from '../models/PagedRecycleBinItemResponseModel'; import type { SortingRequestModel } from '../models/SortingRequestModel'; import type { UpdateMediaRequestModel } from '../models/UpdateMediaRequestModel'; @@ -32,7 +32,7 @@ export class MediaResource { url: '/umbraco/management/api/v1/media', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 401: `The resource is protected and requires an authentication token`, 403: `The authenticated user do not have access to this resource`, @@ -49,7 +49,7 @@ export class MediaResource { id, }: { id: string, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/media/{id}', @@ -142,23 +142,34 @@ export class MediaResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getMediaConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns any Success * @throws ApiError */ public static getMediaItem({ id, - dataTypeId, }: { id?: Array, - dataTypeId?: string, }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/media/item', query: { 'id': id, - 'dataTypeId': dataTypeId, }, errors: { 401: `The resource is protected and requires an authentication token`, @@ -190,7 +201,23 @@ export class MediaResource { } /** - * @returns PagedRecycleBinItemResponseModel Success + * @returns any Success + * @throws ApiError + */ + public static deleteRecycleBinMedia(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/media', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + }, + }); + } + + /** + * @returns PagedMediaRecycleBinItemResponseModel Success * @throws ApiError */ public static getRecycleBinMediaChildren({ @@ -201,7 +228,7 @@ export class MediaResource { parentId?: string, skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/recycle-bin/media/children', @@ -217,7 +244,7 @@ export class MediaResource { } /** - * @returns PagedRecycleBinItemResponseModel Success + * @returns PagedMediaRecycleBinItemResponseModel Success * @throws ApiError */ public static getRecycleBinMediaRoot({ @@ -226,7 +253,7 @@ export class MediaResource { }: { skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/recycle-bin/media/root', @@ -270,30 +297,6 @@ export class MediaResource { }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeMediaItem({ - id, - dataTypeId, - }: { - id?: Array, - dataTypeId?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/media/item', - query: { - 'id': id, - 'dataTypeId': dataTypeId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - /** * @returns PagedMediaTreeItemResponseModel Success * @throws ApiError diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaTypeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaTypeResource.ts index 3e8a455b1c..ff19715b0f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaTypeResource.ts @@ -2,11 +2,17 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { AvailableMediaTypeCompositionResponseModel } from '../models/AvailableMediaTypeCompositionResponseModel'; +import type { CopyMediaTypeRequestModel } from '../models/CopyMediaTypeRequestModel'; import type { CreateFolderRequestModel } from '../models/CreateFolderRequestModel'; import type { CreateMediaTypeRequestModel } from '../models/CreateMediaTypeRequestModel'; import type { FolderResponseModel } from '../models/FolderResponseModel'; +import type { MediaTypeCompositionRequestModel } from '../models/MediaTypeCompositionRequestModel'; +import type { MediaTypeCompositionResponseModel } from '../models/MediaTypeCompositionResponseModel'; import type { MediaTypeItemResponseModel } from '../models/MediaTypeItemResponseModel'; import type { MediaTypeResponseModel } from '../models/MediaTypeResponseModel'; +import type { MoveMediaTypeRequestModel } from '../models/MoveMediaTypeRequestModel'; +import type { PagedAllowedMediaTypeModel } from '../models/PagedAllowedMediaTypeModel'; import type { PagedMediaTypeTreeItemResponseModel } from '../models/PagedMediaTypeTreeItemResponseModel'; import type { UpdateFolderResponseModel } from '../models/UpdateFolderResponseModel'; import type { UpdateMediaTypeRequestModel } from '../models/UpdateMediaTypeRequestModel'; @@ -31,7 +37,7 @@ export class MediaTypeResource { url: '/umbraco/management/api/v1/media-type', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, @@ -111,6 +117,158 @@ export class MediaTypeResource { }); } + /** + * @returns PagedAllowedMediaTypeModel Success + * @throws ApiError + */ + public static getMediaTypeByIdAllowedChildren({ + id, + skip, + take = 100, + }: { + id: string, + skip?: number, + take?: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/{id}/allowed-children', + path: { + 'id': id, + }, + query: { + 'skip': skip, + 'take': take, + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getMediaTypeByIdCompositionReferences({ + id, + }: { + id: string, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/{id}/composition-references', + path: { + 'id': id, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postMediaTypeByIdCopy({ + id, + requestBody, + }: { + id: string, + requestBody?: CopyMediaTypeRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/media-type/{id}/copy', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putMediaTypeByIdMove({ + id, + requestBody, + }: { + id: string, + requestBody?: MoveMediaTypeRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media-type/{id}/move', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns PagedAllowedMediaTypeModel Success + * @throws ApiError + */ + public static getMediaTypeAllowedAtRoot({ + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/allowed-at-root', + query: { + 'skip': skip, + 'take': take, + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postMediaTypeAvailableCompositions({ + requestBody, + }: { + requestBody?: MediaTypeCompositionRequestModel, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/media-type/available-compositions', + body: requestBody, + mediaType: 'application/json', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns string Created * @throws ApiError @@ -125,7 +283,7 @@ export class MediaTypeResource { url: '/umbraco/management/api/v1/media-type/folder', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberGroupResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberGroupResource.ts index adbb074e57..0e0c2a9a84 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberGroupResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberGroupResource.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ import type { MemberGroupItemResponseModel } from '../models/MemberGroupItemResponseModel'; -import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; +import type { PagedNamedEntityTreeItemResponseModel } from '../models/PagedNamedEntityTreeItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -33,7 +33,7 @@ export class MemberGroupResource { } /** - * @returns PagedEntityTreeItemResponseModel Success + * @returns PagedNamedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeMemberGroupRoot({ @@ -42,7 +42,7 @@ export class MemberGroupResource { }: { skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/member-group/root', diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberTypeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberTypeResource.ts index 6352da1962..5ca33add00 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberTypeResource.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ import type { MemberTypeItemResponseModel } from '../models/MemberTypeItemResponseModel'; -import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; +import type { PagedNamedEntityTreeItemResponseModel } from '../models/PagedNamedEntityTreeItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -33,7 +33,7 @@ export class MemberTypeResource { } /** - * @returns PagedEntityTreeItemResponseModel Success + * @returns PagedNamedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeMemberTypeRoot({ @@ -42,7 +42,7 @@ export class MemberTypeResource { }: { skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/member-type/root', diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PackageResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PackageResource.ts index 997effe03a..fc72c5b016 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PackageResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PackageResource.ts @@ -3,6 +3,7 @@ /* tslint:disable */ /* eslint-disable */ import type { CreatePackageRequestModel } from '../models/CreatePackageRequestModel'; +import type { PackageConfigurationResponseModel } from '../models/PackageConfigurationResponseModel'; import type { PackageDefinitionResponseModel } from '../models/PackageDefinitionResponseModel'; import type { PackageManifestResponseModel } from '../models/PackageManifestResponseModel'; import type { PagedPackageDefinitionResponseModel } from '../models/PagedPackageDefinitionResponseModel'; @@ -38,6 +39,20 @@ export class PackageResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getPackageConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/package/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns PagedPackageDefinitionResponseModel Success * @throws ApiError @@ -76,7 +91,7 @@ export class PackageResource { url: '/umbraco/management/api/v1/package/created', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PartialViewResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PartialViewResource.ts index 0f2b69cfca..88accea1fa 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PartialViewResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PartialViewResource.ts @@ -2,13 +2,15 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { CreatePartialViewFolderRequestModel } from '../models/CreatePartialViewFolderRequestModel'; import type { CreatePartialViewRequestModel } from '../models/CreatePartialViewRequestModel'; -import type { CreatePathFolderRequestModel } from '../models/CreatePathFolderRequestModel'; import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; -import type { PagedSnippetItemResponseModel } from '../models/PagedSnippetItemResponseModel'; +import type { PagedPartialViewSnippetItemResponseModel } from '../models/PagedPartialViewSnippetItemResponseModel'; +import type { PartialViewFolderResponseModel } from '../models/PartialViewFolderResponseModel'; import type { PartialViewItemResponseModel } from '../models/PartialViewItemResponseModel'; import type { PartialViewResponseModel } from '../models/PartialViewResponseModel'; import type { PartialViewSnippetResponseModel } from '../models/PartialViewSnippetResponseModel'; +import type { RenamePartialViewRequestModel } from '../models/RenamePartialViewRequestModel'; import type { UpdatePartialViewRequestModel } from '../models/UpdatePartialViewRequestModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -17,27 +19,6 @@ import { request as __request } from '../core/request'; export class PartialViewResource { - /** - * @returns any Success - * @throws ApiError - */ - public static getPartialView({ - path, - }: { - path?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/partial-view', - query: { - 'path': path, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - /** * @returns string Created * @throws ApiError @@ -52,9 +33,11 @@ export class PartialViewResource { url: '/umbraco/management/api/v1/partial-view', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -63,19 +46,20 @@ export class PartialViewResource { * @returns any Success * @throws ApiError */ - public static deletePartialView({ + public static getPartialViewByPath({ path, }: { - path?: string, - }): CancelablePromise { + path: string, + }): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/partial-view', - query: { + method: 'GET', + url: '/umbraco/management/api/v1/partial-view/{path}', + path: { 'path': path, }, errors: { 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -84,59 +68,99 @@ export class PartialViewResource { * @returns any Success * @throws ApiError */ - public static putPartialView({ + public static deletePartialViewByPath({ + path, + }: { + path: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/partial-view/{path}', + path: { + 'path': path, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putPartialViewByPath({ + path, requestBody, }: { + path: string, requestBody?: UpdatePartialViewRequestModel, }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/partial-view', + url: '/umbraco/management/api/v1/partial-view/{path}', + path: { + 'path': path, + }, body: requestBody, mediaType: 'application/json', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } /** - * @returns any Success + * @returns string Created * @throws ApiError */ - public static getPartialViewFolder({ + public static putPartialViewByPathRename({ path, + requestBody, }: { - path?: string, - }): CancelablePromise { + path: string, + requestBody?: RenamePartialViewRequestModel, + }): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/partial-view/folder', - query: { + method: 'PUT', + url: '/umbraco/management/api/v1/partial-view/{path}/rename', + path: { 'path': path, }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } /** - * @returns any Success + * @returns string Created * @throws ApiError */ public static postPartialViewFolder({ requestBody, }: { - requestBody?: CreatePathFolderRequestModel, - }): CancelablePromise { + requestBody?: CreatePartialViewFolderRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/partial-view/folder', body: requestBody, mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -145,19 +169,43 @@ export class PartialViewResource { * @returns any Success * @throws ApiError */ - public static deletePartialViewFolder({ + public static getPartialViewFolderByPath({ path, }: { - path?: string, - }): CancelablePromise { + path: string, + }): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/partial-view/folder', - query: { + method: 'GET', + url: '/umbraco/management/api/v1/partial-view/folder/{path}', + path: { 'path': path, }, errors: { 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deletePartialViewFolderByPath({ + path, + }: { + path: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/partial-view/folder/{path}', + path: { + 'path': path, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -167,15 +215,15 @@ export class PartialViewResource { * @throws ApiError */ public static getPartialViewItem({ - id, + path, }: { - id?: Array, + path?: Array, }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/partial-view/item', query: { - 'id': id, + 'path': path, }, errors: { 401: `The resource is protected and requires an authentication token`, @@ -184,7 +232,7 @@ export class PartialViewResource { } /** - * @returns PagedSnippetItemResponseModel Success + * @returns PagedPartialViewSnippetItemResponseModel Success * @throws ApiError */ public static getPartialViewSnippet({ @@ -193,7 +241,7 @@ export class PartialViewResource { }: { skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/partial-view/snippet', @@ -211,16 +259,16 @@ export class PartialViewResource { * @returns any Success * @throws ApiError */ - public static getPartialViewSnippetByName({ - name, + public static getPartialViewSnippetById({ + id, }: { - name: string, + id: string, }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/partial-view/snippet/{name}', + url: '/umbraco/management/api/v1/partial-view/snippet/{id}', path: { - 'name': name, + 'id': id, }, errors: { 401: `The resource is protected and requires an authentication token`, @@ -234,11 +282,11 @@ export class PartialViewResource { * @throws ApiError */ public static getTreePartialViewChildren({ - path, + parentPath, skip, take = 100, }: { - path?: string, + parentPath?: string, skip?: number, take?: number, }): CancelablePromise { @@ -246,7 +294,7 @@ export class PartialViewResource { method: 'GET', url: '/umbraco/management/api/v1/tree/partial-view/children', query: { - 'path': path, + 'parentPath': parentPath, 'skip': skip, 'take': take, }, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PreviewResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PreviewResource.ts new file mode 100644 index 0000000000..c3e7e42a75 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PreviewResource.ts @@ -0,0 +1,39 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class PreviewResource { + + /** + * @returns any Success + * @throws ApiError + */ + public static deletePreview(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/preview', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postPreview(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/preview', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationTypeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationTypeResource.ts index fd4f1cbc2a..af3b1727a2 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationTypeResource.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ import type { CreateRelationTypeRequestModel } from '../models/CreateRelationTypeRequestModel'; -import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; +import type { PagedNamedEntityTreeItemResponseModel } from '../models/PagedNamedEntityTreeItemResponseModel'; import type { RelationTypeItemResponseModel } from '../models/RelationTypeItemResponseModel'; import type { RelationTypeResponseModel } from '../models/RelationTypeResponseModel'; import type { UpdateRelationTypeRequestModel } from '../models/UpdateRelationTypeRequestModel'; @@ -28,7 +28,7 @@ export class RelationTypeResource { url: '/umbraco/management/api/v1/relation-type', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, @@ -129,7 +129,7 @@ export class RelationTypeResource { } /** - * @returns PagedEntityTreeItemResponseModel Success + * @returns PagedNamedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeRelationTypeRoot({ @@ -138,7 +138,7 @@ export class RelationTypeResource { }: { skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/relation-type/root', diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ScriptResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ScriptResource.ts index 636675a7d7..49829f19db 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ScriptResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ScriptResource.ts @@ -2,9 +2,11 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CreatePathFolderRequestModel } from '../models/CreatePathFolderRequestModel'; +import type { CreateScriptFolderRequestModel } from '../models/CreateScriptFolderRequestModel'; import type { CreateScriptRequestModel } from '../models/CreateScriptRequestModel'; import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; +import type { RenameScriptRequestModel } from '../models/RenameScriptRequestModel'; +import type { ScriptFolderResponseModel } from '../models/ScriptFolderResponseModel'; import type { ScriptItemResponseModel } from '../models/ScriptItemResponseModel'; import type { ScriptResponseModel } from '../models/ScriptResponseModel'; import type { UpdateScriptRequestModel } from '../models/UpdateScriptRequestModel'; @@ -15,27 +17,6 @@ import { request as __request } from '../core/request'; export class ScriptResource { - /** - * @returns any Success - * @throws ApiError - */ - public static getScript({ - path, - }: { - path?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/script', - query: { - 'path': path, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - /** * @returns string Created * @throws ApiError @@ -50,9 +31,11 @@ export class ScriptResource { url: '/umbraco/management/api/v1/script', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -61,19 +44,20 @@ export class ScriptResource { * @returns any Success * @throws ApiError */ - public static deleteScript({ + public static getScriptByPath({ path, }: { - path?: string, - }): CancelablePromise { + path: string, + }): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/script', - query: { + method: 'GET', + url: '/umbraco/management/api/v1/script/{path}', + path: { 'path': path, }, errors: { 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -82,59 +66,99 @@ export class ScriptResource { * @returns any Success * @throws ApiError */ - public static putScript({ + public static deleteScriptByPath({ + path, + }: { + path: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/script/{path}', + path: { + 'path': path, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putScriptByPath({ + path, requestBody, }: { + path: string, requestBody?: UpdateScriptRequestModel, }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/script', + url: '/umbraco/management/api/v1/script/{path}', + path: { + 'path': path, + }, body: requestBody, mediaType: 'application/json', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } /** - * @returns any Success + * @returns string Created * @throws ApiError */ - public static getScriptFolder({ + public static putScriptByPathRename({ path, + requestBody, }: { - path?: string, - }): CancelablePromise { + path: string, + requestBody?: RenameScriptRequestModel, + }): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/script/folder', - query: { + method: 'PUT', + url: '/umbraco/management/api/v1/script/{path}/rename', + path: { 'path': path, }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } /** - * @returns any Success + * @returns string Created * @throws ApiError */ public static postScriptFolder({ requestBody, }: { - requestBody?: CreatePathFolderRequestModel, - }): CancelablePromise { + requestBody?: CreateScriptFolderRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/script/folder', body: requestBody, mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -143,19 +167,43 @@ export class ScriptResource { * @returns any Success * @throws ApiError */ - public static deleteScriptFolder({ + public static getScriptFolderByPath({ path, }: { - path?: string, - }): CancelablePromise { + path: string, + }): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/script/folder', - query: { + method: 'GET', + url: '/umbraco/management/api/v1/script/folder/{path}', + path: { 'path': path, }, errors: { 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteScriptFolderByPath({ + path, + }: { + path: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/script/folder/{path}', + path: { + 'path': path, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -186,11 +234,11 @@ export class ScriptResource { * @throws ApiError */ public static getTreeScriptChildren({ - path, + parentPath, skip, take = 100, }: { - path?: string, + parentPath?: string, skip?: number, take?: number, }): CancelablePromise { @@ -198,7 +246,7 @@ export class ScriptResource { method: 'GET', url: '/umbraco/management/api/v1/tree/script/children', query: { - 'path': path, + 'parentPath': parentPath, 'skip': skip, 'take': take, }, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SecurityResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SecurityResource.ts index e50f16374c..ac7de89f58 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SecurityResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SecurityResource.ts @@ -4,6 +4,7 @@ /* eslint-disable */ import type { ResetPasswordRequestModel } from '../models/ResetPasswordRequestModel'; import type { ResetPasswordTokenRequestModel } from '../models/ResetPasswordTokenRequestModel'; +import type { SecurityConfigurationResponseModel } from '../models/SecurityConfigurationResponseModel'; import type { VerifyResetPasswordTokenRequestModel } from '../models/VerifyResetPasswordTokenRequestModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -12,6 +13,20 @@ import { request as __request } from '../core/request'; export class SecurityResource { + /** + * @returns any Success + * @throws ApiError + */ + public static getSecurityConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/security/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns any Success * @throws ApiError diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ServerResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ServerResource.ts index 0ab367cadb..15d61a5904 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ServerResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ServerResource.ts @@ -2,9 +2,10 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { ServerConfigurationResponseModel } from '../models/ServerConfigurationResponseModel'; import type { ServerInformationResponseModel } from '../models/ServerInformationResponseModel'; import type { ServerStatusResponseModel } from '../models/ServerStatusResponseModel'; -import type { VersionResponseModel } from '../models/VersionResponseModel'; +import type { ServerTroubleshootingResponseModel } from '../models/ServerTroubleshootingResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -12,6 +13,20 @@ import { request as __request } from '../core/request'; export class ServerResource { + /** + * @returns any Success + * @throws ApiError + */ + public static getServerConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/server/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns any Success * @throws ApiError @@ -44,12 +59,11 @@ export class ServerResource { * @returns any Success * @throws ApiError */ - public static getServerVersion(): CancelablePromise { + public static getServerTroubleshooting(): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/server/version', + url: '/umbraco/management/api/v1/server/troubleshooting', errors: { - 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, }, }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StaticFileResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StaticFileResource.ts index 003abb98db..46398324dc 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StaticFileResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StaticFileResource.ts @@ -37,11 +37,11 @@ export class StaticFileResource { * @throws ApiError */ public static getTreeStaticFileChildren({ - path, + parentPath, skip, take = 100, }: { - path?: string, + parentPath?: string, skip?: number, take?: number, }): CancelablePromise { @@ -49,7 +49,7 @@ export class StaticFileResource { method: 'GET', url: '/umbraco/management/api/v1/tree/static-file/children', query: { - 'path': path, + 'parentPath': parentPath, 'skip': skip, 'take': take, }, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StylesheetResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StylesheetResource.ts index a569f44fa2..e6e680eced 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StylesheetResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StylesheetResource.ts @@ -2,16 +2,12 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CreatePathFolderRequestModel } from '../models/CreatePathFolderRequestModel'; +import type { CreateStylesheetFolderRequestModel } from '../models/CreateStylesheetFolderRequestModel'; import type { CreateStylesheetRequestModel } from '../models/CreateStylesheetRequestModel'; -import type { ExtractRichTextStylesheetRulesRequestModel } from '../models/ExtractRichTextStylesheetRulesRequestModel'; -import type { ExtractRichTextStylesheetRulesResponseModel } from '../models/ExtractRichTextStylesheetRulesResponseModel'; -import type { InterpolateRichTextStylesheetRequestModel } from '../models/InterpolateRichTextStylesheetRequestModel'; -import type { InterpolateRichTextStylesheetResponseModel } from '../models/InterpolateRichTextStylesheetResponseModel'; import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; -import type { PagedStylesheetOverviewResponseModel } from '../models/PagedStylesheetOverviewResponseModel'; -import type { RichTextStylesheetRulesResponseModel } from '../models/RichTextStylesheetRulesResponseModel'; -import type { ScriptItemResponseModel } from '../models/ScriptItemResponseModel'; +import type { RenameStylesheetRequestModel } from '../models/RenameStylesheetRequestModel'; +import type { StylesheetFolderResponseModel } from '../models/StylesheetFolderResponseModel'; +import type { StylesheetItemResponseModel } from '../models/StylesheetItemResponseModel'; import type { StylesheetResponseModel } from '../models/StylesheetResponseModel'; import type { UpdateStylesheetRequestModel } from '../models/UpdateStylesheetRequestModel'; @@ -21,27 +17,6 @@ import { request as __request } from '../core/request'; export class StylesheetResource { - /** - * @returns any Success - * @throws ApiError - */ - public static getStylesheet({ - path, - }: { - path?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/stylesheet', - query: { - 'path': path, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - /** * @returns string Created * @throws ApiError @@ -56,9 +31,11 @@ export class StylesheetResource { url: '/umbraco/management/api/v1/stylesheet', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -67,19 +44,20 @@ export class StylesheetResource { * @returns any Success * @throws ApiError */ - public static deleteStylesheet({ + public static getStylesheetByPath({ path, }: { - path?: string, - }): CancelablePromise { + path: string, + }): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/stylesheet', - query: { + method: 'GET', + url: '/umbraco/management/api/v1/stylesheet/{path}', + path: { 'path': path, }, errors: { 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -88,83 +66,99 @@ export class StylesheetResource { * @returns any Success * @throws ApiError */ - public static putStylesheet({ + public static deleteStylesheetByPath({ + path, + }: { + path: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/stylesheet/{path}', + path: { + 'path': path, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putStylesheetByPath({ + path, requestBody, }: { + path: string, requestBody?: UpdateStylesheetRequestModel, }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/stylesheet', + url: '/umbraco/management/api/v1/stylesheet/{path}', + path: { + 'path': path, + }, body: requestBody, mediaType: 'application/json', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } /** - * @returns PagedStylesheetOverviewResponseModel Success + * @returns string Created * @throws ApiError */ - public static getStylesheetAll({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/stylesheet/all', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getStylesheetFolder({ + public static putStylesheetByPathRename({ path, + requestBody, }: { - path?: string, - }): CancelablePromise { + path: string, + requestBody?: RenameStylesheetRequestModel, + }): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/stylesheet/folder', - query: { + method: 'PUT', + url: '/umbraco/management/api/v1/stylesheet/{path}/rename', + path: { 'path': path, }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } /** - * @returns any Success + * @returns string Created * @throws ApiError */ public static postStylesheetFolder({ requestBody, }: { - requestBody?: CreatePathFolderRequestModel, - }): CancelablePromise { + requestBody?: CreateStylesheetFolderRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/stylesheet/folder', body: requestBody, mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -173,19 +167,43 @@ export class StylesheetResource { * @returns any Success * @throws ApiError */ - public static deleteStylesheetFolder({ + public static getStylesheetFolderByPath({ path, }: { - path?: string, - }): CancelablePromise { + path: string, + }): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/stylesheet/folder', - query: { + method: 'GET', + url: '/umbraco/management/api/v1/stylesheet/folder/{path}', + path: { 'path': path, }, errors: { 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteStylesheetFolderByPath({ + path, + }: { + path: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/stylesheet/folder/{path}', + path: { + 'path': path, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, }, }); } @@ -198,7 +216,7 @@ export class StylesheetResource { path, }: { path?: Array, - }): CancelablePromise> { + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/stylesheet/item', @@ -211,77 +229,16 @@ export class StylesheetResource { }); } - /** - * @returns any Success - * @throws ApiError - */ - public static postStylesheetRichTextExtractRules({ - requestBody, - }: { - requestBody?: ExtractRichTextStylesheetRulesRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/stylesheet/rich-text/extract-rules', - body: requestBody, - mediaType: 'application/json', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postStylesheetRichTextInterpolateRules({ - requestBody, - }: { - requestBody?: InterpolateRichTextStylesheetRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/stylesheet/rich-text/interpolate-rules', - body: requestBody, - mediaType: 'application/json', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getStylesheetRichTextRules({ - path, - }: { - path?: string, - }): CancelablePromise<(RichTextStylesheetRulesResponseModel | ExtractRichTextStylesheetRulesResponseModel)> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/stylesheet/rich-text/rules', - query: { - 'path': path, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError */ public static getTreeStylesheetChildren({ - path, + parentPath, skip, take = 100, }: { - path?: string, + parentPath?: string, skip?: number, take?: number, }): CancelablePromise { @@ -289,7 +246,7 @@ export class StylesheetResource { method: 'GET', url: '/umbraco/management/api/v1/tree/stylesheet/children', query: { - 'path': path, + 'parentPath': parentPath, 'skip': skip, 'take': take, }, diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemplateResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemplateResource.ts index 944b8232d4..b2e7170953 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemplateResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemplateResource.ts @@ -3,7 +3,8 @@ /* tslint:disable */ /* eslint-disable */ import type { CreateTemplateRequestModel } from '../models/CreateTemplateRequestModel'; -import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; +import type { PagedNamedEntityTreeItemResponseModel } from '../models/PagedNamedEntityTreeItemResponseModel'; +import type { TemplateConfigurationResponseModel } from '../models/TemplateConfigurationResponseModel'; import type { TemplateItemResponseModel } from '../models/TemplateItemResponseModel'; import type { TemplateQueryExecuteModel } from '../models/TemplateQueryExecuteModel'; import type { TemplateQueryResultResponseModel } from '../models/TemplateQueryResultResponseModel'; @@ -32,7 +33,7 @@ export class TemplateResource { url: '/umbraco/management/api/v1/template', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, @@ -113,6 +114,20 @@ export class TemplateResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getTemplateConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/template/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns any Success * @throws ApiError @@ -191,7 +206,7 @@ export class TemplateResource { } /** - * @returns PagedEntityTreeItemResponseModel Success + * @returns PagedNamedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeTemplateChildren({ @@ -202,7 +217,7 @@ export class TemplateResource { parentId?: string, skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/template/children', @@ -218,7 +233,7 @@ export class TemplateResource { } /** - * @returns PagedEntityTreeItemResponseModel Success + * @returns PagedNamedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeTemplateRoot({ @@ -227,7 +242,7 @@ export class TemplateResource { }: { skip?: number, take?: number, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/template/root', diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts index 4e11a15af8..28ccb40cf5 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts @@ -27,7 +27,7 @@ export class TemporaryFileResource { url: '/umbraco/management/api/v1/temporaryfile', formData: formData, mediaType: 'multipart/form-data', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, @@ -81,4 +81,18 @@ export class TemporaryFileResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getTemporaryfileConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/temporaryfile/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + } diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserGroupResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserGroupResource.ts index 5c619e1448..ce4526d8d1 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserGroupResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserGroupResource.ts @@ -51,7 +51,7 @@ export class UserGroupResource { url: '/umbraco/management/api/v1/user-group', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 400: `Bad Request`, 401: `The resource is protected and requires an authentication token`, @@ -155,6 +155,60 @@ export class UserGroupResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static deleteUserGroupByIdUsers({ + id, + requestBody, + }: { + id: string, + requestBody?: Array, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user-group/{id}/users', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserGroupByIdUsers({ + id, + requestBody, + }: { + id: string, + requestBody?: Array, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user-group/{id}/users', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + /** * @returns any Success * @throws ApiError diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserResource.ts index 212388f45a..09ed5b23ed 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserResource.ts @@ -7,23 +7,28 @@ import type { CreateInitialPasswordUserRequestModel } from '../models/CreateInit import type { CreateUserRequestModel } from '../models/CreateUserRequestModel'; import type { CreateUserResponseModel } from '../models/CreateUserResponseModel'; import type { CurrentUserResponseModel } from '../models/CurrentUserResponseModel'; +import type { CurrenUserConfigurationResponseModel } from '../models/CurrenUserConfigurationResponseModel'; import type { DeleteUsersRequestModel } from '../models/DeleteUsersRequestModel'; import type { DirectionModel } from '../models/DirectionModel'; import type { DisableUserRequestModel } from '../models/DisableUserRequestModel'; +import type { EnableTwoFactorRequestModel } from '../models/EnableTwoFactorRequestModel'; import type { EnableUserRequestModel } from '../models/EnableUserRequestModel'; import type { InviteUserRequestModel } from '../models/InviteUserRequestModel'; import type { LinkedLoginsRequestModel } from '../models/LinkedLoginsRequestModel'; +import type { NoopSetupTwoFactorModel } from '../models/NoopSetupTwoFactorModel'; import type { PagedUserResponseModel } from '../models/PagedUserResponseModel'; import type { ResendInviteUserRequestModel } from '../models/ResendInviteUserRequestModel'; import type { SetAvatarRequestModel } from '../models/SetAvatarRequestModel'; import type { UnlockUsersRequestModel } from '../models/UnlockUsersRequestModel'; import type { UpdateUserGroupsOnUserRequestModel } from '../models/UpdateUserGroupsOnUserRequestModel'; import type { UpdateUserRequestModel } from '../models/UpdateUserRequestModel'; +import type { UserConfigurationResponseModel } from '../models/UserConfigurationResponseModel'; import type { UserItemResponseModel } from '../models/UserItemResponseModel'; import type { UserOrderModel } from '../models/UserOrderModel'; import type { UserPermissionsResponseModel } from '../models/UserPermissionsResponseModel'; import type { UserResponseModel } from '../models/UserResponseModel'; import type { UserStateModel } from '../models/UserStateModel'; +import type { UserTwoFactorProviderModel } from '../models/UserTwoFactorProviderModel'; import type { VerifyInviteUserRequestModel } from '../models/VerifyInviteUserRequestModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -169,6 +174,56 @@ export class UserResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getUserById2Fa({ + id, + }: { + id: string, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/{id}/2fa', + path: { + 'id': id, + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteUserById2FaByProviderName({ + id, + providerName, + }: { + id: string, + providerName: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user/{id}/2fa/{providerName}', + path: { + 'id': id, + 'providerName': providerName, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + /** * @returns any Success * @throws ApiError @@ -243,6 +298,20 @@ export class UserResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getUserConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns any Success * @throws ApiError @@ -258,6 +327,98 @@ export class UserResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getUserCurrent2Fa(): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/2fa', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteUserCurrent2FaByProviderName({ + providerName, + code, + }: { + providerName: string, + code?: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', + path: { + 'providerName': providerName, + }, + query: { + 'code': code, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserCurrent2FaByProviderName({ + providerName, + requestBody, + }: { + providerName: string, + requestBody?: EnableTwoFactorRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', + path: { + 'providerName': providerName, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getUserCurrent2FaByProviderName({ + providerName, + }: { + providerName: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', + path: { + 'providerName': providerName, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + /** * @returns any Success * @throws ApiError @@ -299,6 +460,20 @@ export class UserResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getUserCurrentConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** * @returns any Success * @throws ApiError @@ -473,7 +648,7 @@ export class UserResource { url: '/umbraco/management/api/v1/user/invite', body: requestBody, mediaType: 'application/json', - responseHeader: 'Location', + responseHeader: 'Umb-Generated-Resource', errors: { 401: `The resource is protected and requires an authentication token`, }, diff --git a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts index da515cb035..42039c3db4 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/class-api/class.mixin.ts @@ -20,13 +20,30 @@ type UmbClassMixinConstructor = new ( controllerAlias?: UmbControllerAlias, ) => UmbClassMixinDeclaration; -declare class UmbClassMixinDeclaration implements UmbClassMixinInterface { +// TODO: we need the interface from EventTarget to be part of the controller base. As a temp solution the UmbClassMixinDeclaration extends EventTarget. +declare class UmbClassMixinDeclaration extends EventTarget implements UmbClassMixinInterface { _host: UmbControllerHost; + + /** + * @description Observe a RxJS source of choice. + * @param {Observable} source RxJS source + * @param {method} callback Callback method called when data is changed. + * @return {UmbObserverController} Reference to a Observer Controller instance + * @memberof UmbClassMixin + */ observe( source: Observable, callback: (_value: T) => void, controllerAlias?: UmbControllerAlias, ): UmbObserverController; + + /** + * @description Provide a context API for this or child elements. + * @param {string} contextAlias + * @param {instance} instance The API instance to be exposed. + * @return {UmbContextProviderController} Reference to a Context Provider Controller instance + * @memberof UmbClassMixin + */ provideContext< BaseType = unknown, ResultType extends BaseType = BaseType, @@ -35,10 +52,19 @@ declare class UmbClassMixinDeclaration implements UmbClassMixinInterface { alias: string | UmbContextToken, instance: InstanceType, ): UmbContextProviderController; + + /** + * @description Setup a subscription for a context. The callback is called when the context is resolved. + * @param {string} contextAlias + * @param {method} callback Callback method called when context is resolved. + * @return {UmbContextConsumerController} Reference to a Context Consumer Controller instance + * @memberof UmbClassMixin + */ consumeContext( alias: string | UmbContextToken, callback: UmbContextCallback, ): UmbContextConsumerController; + hasController(controller: UmbController): boolean; getControllers(filterMethod: (ctrl: UmbController) => boolean): UmbController[]; addController(controller: UmbController): void; @@ -49,6 +75,11 @@ declare class UmbClassMixinDeclaration implements UmbClassMixinInterface { get controllerAlias(): UmbControllerAlias; hostConnected(): void; hostDisconnected(): void; + + /** + * @description Destroys the controller and removes it from the host. + * @memberof UmbClassMixin + */ destroy(): void; } @@ -72,24 +103,10 @@ export const UmbClassMixin = (superClass: T) => { return this._controllerAlias; } - /** - * @description Observe a RxJS source of choice. - * @param {Observable} source RxJS source - * @param {method} callback Callback method called when data is changed. - * @return {UmbObserverController} Reference to a Observer Controller instance - * @memberof UmbElementMixin - */ observe(source: Observable, callback: (_value: T) => void, controllerAlias?: UmbControllerAlias) { return new UmbObserverController(this, source, callback, controllerAlias); } - /** - * @description Provide a context API for this or child elements. - * @param {string} contextAlias - * @param {instance} instance The API instance to be exposed. - * @return {UmbContextProviderController} Reference to a Context Provider Controller instance - * @memberof UmbElementMixin - */ provideContext< BaseType = unknown, ResultType extends BaseType = BaseType, @@ -98,13 +115,6 @@ export const UmbClassMixin = (superClass: T) => { return new UmbContextProviderController(this, contextAlias, instance); } - /** - * @description Setup a subscription for a context. The callback is called when the context is resolved. - * @param {string} contextAlias - * @param {method} callback Callback method called when context is resolved. - * @return {UmbContextConsumerController} Reference to a Context Consumer Controller instance - * @memberof UmbElementMixin - */ consumeContext( contextAlias: string | UmbContextToken, callback: UmbContextCallback, @@ -112,10 +122,6 @@ export const UmbClassMixin = (superClass: T) => { return new UmbContextConsumerController(this, contextAlias, callback); } - /** - * @description Destroys the controller and removes it from the host. - * @memberof UmbClassMixin - */ public destroy() { if (this._host) { this._host.removeController(this); diff --git a/src/Umbraco.Web.UI.Client/src/libs/class-api/context-base.class.ts b/src/Umbraco.Web.UI.Client/src/libs/class-api/context-base.class.ts index 204c2c2ae2..d299c3a9af 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/class-api/context-base.class.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/class-api/context-base.class.ts @@ -1,5 +1,5 @@ -import { type UmbContextToken } from '../context-api/index.js'; -import { type UmbControllerHost } from '../controller-api/index.js'; +import type { UmbContextToken } from '../context-api/index.js'; +import type { UmbControllerHost } from '../controller-api/index.js'; import { UmbBaseController } from './controller-base.class.js'; /** diff --git a/src/Umbraco.Web.UI.Client/src/libs/class-api/controller-base.class.ts b/src/Umbraco.Web.UI.Client/src/libs/class-api/controller-base.class.ts index 5c2b78b2b7..00200fec9c 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/class-api/controller-base.class.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/class-api/controller-base.class.ts @@ -1,4 +1,4 @@ -import { type UmbController } from '../controller-api/controller.interface.js'; +import type { UmbController } from '../controller-api/controller.interface.js'; import { UmbClassMixin } from './index.js'; /** @@ -6,4 +6,4 @@ import { UmbClassMixin } from './index.js'; * This enables controllers to be added to the life cycle of this element. * */ -export abstract class UmbBaseController extends UmbClassMixin(class {}) implements UmbController {} +export abstract class UmbBaseController extends UmbClassMixin(EventTarget) implements UmbController {} diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts index f2e5388c63..934a3c2801 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.controller.ts @@ -1,6 +1,6 @@ -import { UmbContextToken } from '../token/context-token.js'; +import type { UmbContextToken } from '../token/context-token.js'; import { UmbContextConsumer } from './context-consumer.js'; -import { UmbContextCallback } from './context-request.event.js'; +import type { UmbContextCallback } from './context-request.event.js'; import type { UmbControllerHost, UmbController } from '@umbraco-cms/backoffice/controller-api'; export class UmbContextConsumerController diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts index c7f8a2f585..e90a1d50ea 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.test.ts @@ -2,7 +2,8 @@ import { expect, oneEvent } from '@open-wc/testing'; import { UmbContextProvider } from '../provide/context-provider.js'; import { UmbContextToken } from '../token/context-token.js'; import { UmbContextConsumer } from './context-consumer.js'; -import { UmbContextRequestEventImplementation, UMB_CONTENT_REQUEST_EVENT_TYPE } from './context-request.event.js'; +import type { UmbContextRequestEventImplementation} from './context-request.event.js'; +import { UMB_CONTENT_REQUEST_EVENT_TYPE } from './context-request.event.js'; const testContextAlias = 'my-test-context'; const testContextAliasAndApiAlias = 'my-test-context#testApi'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts index d73ae9e2ed..5f555f69e4 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-consumer.ts @@ -1,11 +1,12 @@ -import { UmbContextDiscriminator, UmbContextToken } from '../token/context-token.js'; +import type { UmbContextDiscriminator, UmbContextToken } from '../token/context-token.js'; import { isUmbContextProvideEventType, //isUmbContextUnprovidedEventType, UMB_CONTEXT_PROVIDE_EVENT_TYPE, //umbContextUnprovidedEventType, } from '../provide/context-provide.event.js'; -import { UmbContextRequestEventImplementation, UmbContextCallback } from './context-request.event.js'; +import type { UmbContextCallback } from './context-request.event.js'; +import { UmbContextRequestEventImplementation } from './context-request.event.js'; /** * @export diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.test.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.test.ts index e0c7c3e911..6a7af17917 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/consume/context-request.event.test.ts @@ -1,5 +1,6 @@ import { expect } from '@open-wc/testing'; -import { UmbContextRequestEventImplementation, UmbContextRequestEvent } from './context-request.event.js'; +import type { UmbContextRequestEvent } from './context-request.event.js'; +import { UmbContextRequestEventImplementation } from './context-request.event.js'; describe('UmbContextRequestEvent', () => { const contextRequestCallback = () => { diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provide.event.test.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provide.event.test.ts index a7c3edfbe4..d8fdc43bc6 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provide.event.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provide.event.test.ts @@ -1,5 +1,6 @@ import { expect } from '@open-wc/testing'; -import { UmbContextProvideEventImplementation, UmbContextProvideEvent } from './context-provide.event.js'; +import type { UmbContextProvideEvent } from './context-provide.event.js'; +import { UmbContextProvideEventImplementation } from './context-provide.event.js'; describe('UmbContextProvideEvent', () => { const event: UmbContextProvideEvent = new UmbContextProvideEventImplementation('my-test-context-alias'); diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provide.event.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provide.event.ts index 348b813880..072ec1342b 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provide.event.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provide.event.ts @@ -1,4 +1,4 @@ -import { UmbContextToken } from '../token/context-token.js'; +import type { UmbContextToken } from '../token/context-token.js'; export const UMB_CONTEXT_PROVIDE_EVENT_TYPE = 'umb:context-provide'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts index 1b2ecac03c..fd68e8691f 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.controller.ts @@ -1,4 +1,4 @@ -import { UmbContextToken } from '../token/context-token.js'; +import type { UmbContextToken } from '../token/context-token.js'; import { UmbContextProvider } from './context-provider.js'; import type { UmbControllerHost, UmbController } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.element.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.element.ts index b965b9d6e4..c31a9e8f44 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.element.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.element.ts @@ -1,5 +1,7 @@ -import { UmbControllerHostElement, UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; -import { UmbContextProviderController, UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHostElement} from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; // TODO: There is some circular reference from this to Controller-api which is not good. We should move this elsewhere as we do not encourage the use of this element. Its only purpose is within Storybook and tests. /** diff --git a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts index 0c26920c91..097dfdf002 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/context-api/provide/context-provider.ts @@ -1,9 +1,10 @@ +import type { + UmbContextRequestEvent} from '../consume/context-request.event.js'; import { - UmbContextRequestEvent, UMB_CONTENT_REQUEST_EVENT_TYPE, UMB_DEBUG_CONTEXT_EVENT_TYPE, } from '../consume/context-request.event.js'; -import { UmbContextToken } from '../token/context-token.js'; +import type { UmbContextToken } from '../token/context-token.js'; import { UmbContextProvideEventImplementation, //UmbContextUnprovidedEventImplementation, diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-provider.element.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-provider.element.ts index dcf51c0277..75264a36bd 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-provider.element.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-provider.element.ts @@ -1,4 +1,5 @@ -import { UmbControllerHostElement, UmbControllerHostElementMixin } from './controller-host-element.mixin.js'; +import type { UmbControllerHostElement} from './controller-host-element.mixin.js'; +import { UmbControllerHostElementMixin } from './controller-host-element.mixin.js'; export class UmbControllerHostProviderElement extends UmbControllerHostElementMixin(HTMLElement) diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-provider.test.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-provider.test.ts index a901b0291c..ac4b1044c4 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-provider.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-provider.test.ts @@ -1,6 +1,7 @@ import { expect, fixture, html } from '@open-wc/testing'; import { UmbControllerHostProviderElement } from './controller-host-provider.element.js'; -import { UmbControllerHostElement, UmbControllerHostElementMixin } from './controller-host-element.mixin.js'; +import type { UmbControllerHostElement} from './controller-host-element.mixin.js'; +import { UmbControllerHostElementMixin } from './controller-host-element.mixin.js'; import { customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbContextConsumerController, UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host.interface.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host.interface.ts index 038b1e2e72..b9a8d36586 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host.interface.ts @@ -1,6 +1,6 @@ import type { UmbController } from './controller.interface.js'; -export declare class UmbControllerHost { +export interface UmbControllerHost { hasController(controller: UmbController): boolean; getControllers(filterMethod: (ctrl: UmbController) => boolean): UmbController[]; addController(controller: UmbController): void; diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host.mixin.ts index b91d443105..e79ecac7be 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host.mixin.ts @@ -1,5 +1,5 @@ import type { ClassConstructor } from '../extension-api/types/utils.js'; -import { UmbControllerHost } from './controller-host.interface.js'; +import type { UmbControllerHost } from './controller-host.interface.js'; import type { UmbController } from './controller.interface.js'; declare class UmbControllerHostBaseDeclaration implements Omit { diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller.event.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller.event.ts new file mode 100644 index 0000000000..e51bc0ca23 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller.event.ts @@ -0,0 +1,5 @@ +export class UmbControllerEvent extends Event { + public constructor(type: string) { + super(type, { bubbles: false, composed: false, cancelable: false }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller.test.ts index a0fb00693b..e00bf00316 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller.test.ts @@ -1,8 +1,8 @@ import { expect } from '@open-wc/testing'; import { type UmbControllerHostElement, UmbControllerHostElementMixin } from './controller-host-element.mixin.js'; import { UmbControllerHostMixin } from './controller-host.mixin.js'; -import { type UmbControllerAlias } from './controller-alias.type.js'; -import { type UmbControllerHost } from './controller-host.interface.js'; +import type { UmbControllerAlias } from './controller-alias.type.js'; +import type { UmbControllerHost } from './controller-host.interface.js'; import { customElement } from '@umbraco-cms/backoffice/external/lit'; @customElement('test-my-controller-host') diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/index.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/index.ts index 26ffaaec28..40d2c77261 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/index.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/index.ts @@ -3,3 +3,4 @@ export * from './controller-host.interface.js'; export * from './controller-host-element.mixin.js'; export * from './controller.interface.js'; export * from './controller-alias.type.js'; +export * from './controller.event.js'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts index 1c4cd6285c..604601de81 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts @@ -1,15 +1,11 @@ -import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api'; +import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { HTMLElementConstructor } from '@umbraco-cms/backoffice/extension-api'; -import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { - UmbContextToken, - UmbContextCallback, - UmbContextConsumerController, - UmbContextProviderController, -} from '@umbraco-cms/backoffice/context-api'; -import { ObserverCallback, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; +import { UmbControllerHostElementMixin, type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbContextToken, UmbContextCallback } from '@umbraco-cms/backoffice/context-api'; +import { UmbContextConsumerController, UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; +import type { ObserverCallback } from '@umbraco-cms/backoffice/observable-api'; +import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; export declare class UmbElement extends UmbControllerHostElement { /** @@ -38,14 +34,14 @@ export declare class UmbElement extends UmbControllerHostElement { ): UmbContextConsumerController; /** * Use the UmbLocalizeController to localize your element. - * @see UmbLocalizeController + * @see UmbLocalizationController */ - localize: UmbLocalizeController; + localize: UmbLocalizationController; } export const UmbElementMixin = (superClass: T) => { class UmbElementMixinClass extends UmbControllerHostElementMixin(superClass) implements UmbElement { - localize: UmbLocalizeController = new UmbLocalizeController(this); + localize: UmbLocalizationController = new UmbLocalizationController(this); /** * @description Observe a RxJS source of choice. diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/condition/condition-controller-arguments.type.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/condition/condition-controller-arguments.type.ts index 47e3718dae..550ef08a54 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/condition/condition-controller-arguments.type.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/condition/condition-controller-arguments.type.ts @@ -1,4 +1,4 @@ -import { UmbConditionConfigBase } from '../types/index.js'; +import type { UmbConditionConfigBase } from '../types/index.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export type UmbConditionControllerArguments< diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/condition/extension-condition.interface.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/condition/extension-condition.interface.ts index 446d3b2d03..bdd9e88ba3 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/condition/extension-condition.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/condition/extension-condition.interface.ts @@ -1,5 +1,5 @@ import type { UmbConditionConfigBase } from '../types/index.js'; -import { UmbController } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbController } from '@umbraco-cms/backoffice/controller-api'; export interface UmbExtensionCondition extends UmbController { readonly permitted: boolean; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.test.ts index defda3c310..934f74f0e6 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.test.ts @@ -7,15 +7,16 @@ import type { } from '../types/index.js'; import { UmbExtensionRegistry } from '../registry/extension.registry.js'; import type { UmbExtensionCondition } from '../condition/extension-condition.interface.js'; +import type { + UmbControllerHostElement} from '../../controller-api/controller-host-element.mixin.js'; import { - UmbControllerHostElement, UmbControllerHostElementMixin, } from '../../controller-api/controller-host-element.mixin.js'; import { UmbBaseExtensionInitializer } from './index.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import { customElement, html } from '@umbraco-cms/backoffice/external/lit'; import { UmbSwitchCondition } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @customElement('umb-test-controller-host') export class UmbTestControllerHostElement extends UmbControllerHostElementMixin(HTMLElement) {} diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts index 8a2a17358d..816a32e4a0 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts @@ -1,14 +1,14 @@ import type { UmbExtensionCondition } from '../condition/extension-condition.interface.js'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { - type ManifestCondition, - type ManifestWithDynamicConditions, - type UmbExtensionRegistry, - createExtensionApi, +import { createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbConditionConfigBase, + ManifestCondition, + ManifestWithDynamicConditions, + UmbExtensionRegistry, } from '@umbraco-cms/backoffice/extension-api'; -import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; /** * This abstract Controller holds the core to manage a single Extension. @@ -73,7 +73,7 @@ export abstract class UmbBaseExtensionInitializer< } protected _init() { this.#manifestObserver = this.observe( - this.#extensionRegistry.getByAlias(this.#alias), + this.#extensionRegistry.byAlias(this.#alias), async (extensionManifest) => { this.#clearPermittedState(); this.#manifest = extensionManifest; @@ -143,7 +143,7 @@ export abstract class UmbBaseExtensionInitializer< if (conditionConfigs.length > 0) { // Observes the conditions and initialize as they come in. this.observe( - this.#extensionRegistry.getByTypeAndAliases('condition', conditionAliases), + this.#extensionRegistry.byTypeAndAliases('condition', conditionAliases), this.#gotConditions, '_observeConditions', ); diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.test.ts index c45eb296aa..494388266e 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.test.ts @@ -1,10 +1,12 @@ import { expect, fixture } from '@open-wc/testing'; import { UmbExtensionRegistry } from '../registry/extension.registry.js'; -import { ManifestCondition, ManifestWithDynamicConditions, UmbConditionConfigBase } from '../types/index.js'; -import { UmbExtensionCondition } from '../condition/extension-condition.interface.js'; -import { PermittedControllerType, UmbBaseExtensionInitializer, UmbBaseExtensionsInitializer } from './index.js'; +import type { ManifestCondition, ManifestWithDynamicConditions, UmbConditionConfigBase } from '../types/index.js'; +import type { UmbExtensionCondition } from '../condition/extension-condition.interface.js'; +import type { PermittedControllerType} from './index.js'; +import { UmbBaseExtensionInitializer, UmbBaseExtensionsInitializer } from './index.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UmbControllerHost, UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost} from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; import { customElement, html } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-test-controller-host') diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts index 4d8f579ec4..b08e5cac83 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts @@ -1,4 +1,4 @@ -import { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js'; +import type { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; import type { ManifestBase, @@ -6,7 +6,7 @@ import type { UmbExtensionRegistry, } from '@umbraco-cms/backoffice/extension-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export type PermittedControllerType = ControllerType & { manifest: Required>; @@ -56,8 +56,8 @@ export abstract class UmbBaseExtensionsInitializer< } protected _init() { let source = Array.isArray(this.#type) - ? this.#extensionRegistry.extensionsOfTypes(this.#type as string[]) - : this.#extensionRegistry.extensionsOfType(this.#type as ManifestTypeName); + ? this.#extensionRegistry.byTypes(this.#type as string[]) + : this.#extensionRegistry.byType(this.#type as ManifestTypeName); if (this.#filter) { source = source.pipe(map((extensions: Array) => extensions.filter(this.#filter!))); } diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-initializer.controller.ts index dddca2a2ba..a959deb3be 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-initializer.controller.ts @@ -3,7 +3,7 @@ import type { UmbApi } from '../models/api.interface.js'; import type { UmbExtensionRegistry } from '../registry/extension.registry.js'; import type { ManifestApi, ManifestCondition } from '../types/index.js'; import { UmbBaseExtensionInitializer } from './base-extension-initializer.controller.js'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** * This Controller manages a single Extension and its API instance. diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-initializer.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-initializer.test.ts index a9bf451556..469d237d91 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-initializer.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-initializer.test.ts @@ -1,13 +1,10 @@ import { expect, fixture } from '@open-wc/testing'; import { UmbExtensionRegistry } from '../registry/extension.registry.js'; -import { ManifestApi, ManifestWithDynamicConditions } from '../types/index.js'; +import type { ManifestApi, ManifestWithDynamicConditions } from '../types/index.js'; import { UmbExtensionApiInitializer } from './index.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { - type UmbControllerHost, - UmbControllerHostElement, - UmbControllerHostElementMixin, -} from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { customElement, html } from '@umbraco-cms/backoffice/external/lit'; import { type ManifestSection, UmbSwitchCondition } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-initializer.controller.ts index a7a7566212..8b397dc3fa 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-initializer.controller.ts @@ -1,8 +1,8 @@ import { createExtensionElement } from '../functions/create-extension-element.function.js'; -import { UmbExtensionRegistry } from '../registry/extension.registry.js'; -import { ManifestCondition, ManifestWithDynamicConditions } from '../types/index.js'; +import type { UmbExtensionRegistry } from '../registry/extension.registry.js'; +import type { ManifestCondition, ManifestWithDynamicConditions } from '../types/index.js'; import { UmbBaseExtensionInitializer } from './base-extension-initializer.controller.js'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** * This Controller manages a single Extension and its Element. diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-initializer.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-initializer.test.ts index ba82268e31..a76dffd077 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-initializer.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-initializer.test.ts @@ -1,7 +1,8 @@ import { expect, fixture } from '@open-wc/testing'; import { UmbExtensionRegistry } from '../registry/extension.registry.js'; import { UmbExtensionElementInitializer } from './index.js'; -import { UmbControllerHostElement, UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement} from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; import { customElement, html } from '@umbraco-cms/backoffice/external/lit'; import { type ManifestSection, UmbSwitchCondition } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-api-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-api-initializer.controller.ts index 1f1c40a75a..dbd23b5bc1 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-api-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-api-initializer.controller.ts @@ -1,10 +1,10 @@ -import { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js'; +import type { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js'; import { type PermittedControllerType, UmbBaseExtensionsInitializer, } from './base-extensions-initializer.controller.js'; import { UmbExtensionApiInitializer } from './extension-api-initializer.controller.js'; -import { type UmbExtensionRegistry, ManifestApi, ManifestBase } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestApi, ManifestBase, UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-element-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-element-initializer.controller.ts index d12714c73b..a40f574a34 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-element-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-element-initializer.controller.ts @@ -27,7 +27,7 @@ export class UmbExtensionsElementInitializer< > { // #extensionRegistry; - private _defaultElement?: string; + #defaultElement?: string; #props?: Record; public get properties() { @@ -50,7 +50,7 @@ export class UmbExtensionsElementInitializer< ) { super(host, extensionRegistry, type, filter, onChange); this.#extensionRegistry = extensionRegistry; - this._defaultElement = defaultElement; + this.#defaultElement = defaultElement; this._init(); } @@ -60,7 +60,7 @@ export class UmbExtensionsElementInitializer< this.#extensionRegistry, manifest.alias, this._extensionChanged, - this._defaultElement, + this.#defaultElement, ) as ControllerType; extController.properties = this.#props; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-manifest-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-manifest-initializer.controller.ts index 7b6592bad4..cdc81163b3 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-manifest-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-manifest-initializer.controller.ts @@ -4,8 +4,8 @@ import { type PermittedControllerType, UmbBaseExtensionsInitializer, } from './base-extensions-initializer.controller.js'; -import { type ManifestBase, type UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { ManifestBase, UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** */ diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-api.function.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-api.function.ts index 9a31cb7496..2c2264efaf 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-api.function.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-api.function.ts @@ -1,5 +1,5 @@ -import { UmbApi } from '../models/api.interface.js'; -import { ManifestApi, ManifestElementAndApi } from '../types/base.types.js'; +import type { UmbApi } from '../models/api.interface.js'; +import type { ManifestApi, ManifestElementAndApi } from '../types/base.types.js'; import { loadManifestApi } from './load-manifest-api.function.js'; export async function createExtensionApi( diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-api.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-api.test.ts index cabef4207a..5129c098c3 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-api.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-api.test.ts @@ -1,6 +1,6 @@ import { expect } from '@open-wc/testing'; -import { ManifestApi } from '../types/index.js'; -import { UmbApi } from '../models/api.interface.js'; +import type { ManifestApi } from '../types/index.js'; +import type { UmbApi } from '../models/api.interface.js'; import { createExtensionApi } from './create-extension-api.function.js'; class UmbExtensionApiTrueTestClass implements UmbApi { diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.function.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.function.ts index 05544a62e0..82504d1c38 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.function.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.function.ts @@ -1,4 +1,4 @@ -import { ManifestElement, ManifestElementAndApi } from '../types/base.types.js'; +import type { ManifestElement, ManifestElementAndApi } from '../types/base.types.js'; import { loadManifestElement } from './load-manifest-element.function.js'; export async function createExtensionElement( diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts index 3b97e358c5..fca6483987 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element.test.ts @@ -1,5 +1,5 @@ import { expect } from '@open-wc/testing'; -import { ManifestElement, ManifestElementAndApi } from '../types/index.js'; +import type { ManifestElement, ManifestElementAndApi } from '../types/index.js'; import { createExtensionElement } from './create-extension-element.function.js'; import { customElement } from '@umbraco-cms/backoffice/external/lit'; @@ -61,7 +61,9 @@ describe('Extension-Api: Create Extension Element', () => { type: 'my-test-type', alias: 'Umb.Test.CreateManifestElement', name: 'pretty name', - api: class TestApi {}, + api: class TestApi { + destroy() {} + }, }; const element = await createExtensionElement(manifest, 'umb-extension-api-true-test-element'); diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/bundle-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/bundle-extension-initializer.ts index e48e049bb0..23555f8246 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/bundle-extension-initializer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/bundle-extension-initializer.ts @@ -1,8 +1,8 @@ import type { ManifestBase, ManifestBundle } from '../types/index.js'; -import { UmbExtensionRegistry } from '../registry/extension.registry.js'; +import type { UmbExtensionRegistry } from '../registry/extension.registry.js'; import { loadManifestPlainJs } from '../functions/load-manifest-plain-js.function.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export class UmbBundleExtensionInitializer extends UmbBaseController { #extensionRegistry; @@ -11,7 +11,7 @@ export class UmbBundleExtensionInitializer extends UmbBaseController { constructor(host: UmbControllerHostElement, extensionRegistry: UmbExtensionRegistry) { super(host); this.#extensionRegistry = extensionRegistry; - this.observe(extensionRegistry.extensionsOfType('bundle'), (bundles) => { + this.observe(extensionRegistry.byType('bundle'), (bundles) => { // Unregister removed bundles: this.#bundleMap.forEach((existingBundle) => { if (!bundles.find((b) => b.alias === existingBundle.alias)) { diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/entry-point-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/entry-point-extension-initializer.ts index c7a5a8145b..5823bc9c59 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/entry-point-extension-initializer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/entry-point-extension-initializer.ts @@ -1,8 +1,8 @@ import type { ManifestEntryPoint } from '../types/index.js'; -import { UmbExtensionRegistry } from '../registry/extension.registry.js'; +import type { UmbExtensionRegistry } from '../registry/extension.registry.js'; import { hasInitExport, loadManifestPlainJs } from '../functions/index.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UmbElement } from '@umbraco-cms/backoffice/element-api'; +import type { UmbElement } from '@umbraco-cms/backoffice/element-api'; export class UmbEntryPointExtensionInitializer extends UmbBaseController { #host; @@ -13,7 +13,7 @@ export class UmbEntryPointExtensionInitializer extends UmbBaseController { super(host); this.#host = host; this.#extensionRegistry = extensionRegistry; - this.observe(extensionRegistry.extensionsOfType('entryPoint'), (entryPoints) => { + this.observe(extensionRegistry.byType('entryPoint'), (entryPoints) => { entryPoints.forEach((entryPoint) => { if (this.#entryPointMap.has(entryPoint.alias)) return; this.#entryPointMap.set(entryPoint.alias, entryPoint); diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/models/api.interface.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/models/api.interface.ts index d6a5f9ec78..ebd774bf54 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/models/api.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/models/api.interface.ts @@ -1,3 +1,3 @@ export interface UmbApi { - destroy?(): void; + destroy(): void; } diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/models/entry-point.interface.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/models/entry-point.interface.ts index 43fe10fa8d..7359ae0865 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/models/entry-point.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/models/entry-point.interface.ts @@ -1,5 +1,5 @@ import type { UmbExtensionRegistry } from '../registry/extension.registry.js'; -import { ManifestBase } from '../types/index.js'; +import type { ManifestBase } from '../types/index.js'; import type { UmbElement } from '@umbraco-cms/backoffice/element-api'; export type UmbEntryPointOnInit = (host: UmbElement, extensionRegistry: UmbExtensionRegistry) => void; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.test.ts index b0492dc21c..68e00ddbd7 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.test.ts @@ -47,6 +47,7 @@ describe('UmbExtensionRegistry', () => { type: 'workspace', name: 'test-editor-1', alias: 'Umb.Test.Editor.1', + weight: 2, meta: { entityType: 'testEntity', }, @@ -66,10 +67,20 @@ describe('UmbExtensionRegistry', () => { expect(extensionRegistry.isRegistered('Umb.Test.Section.1')).to.be.true; }); + it('should get several extensions by type', (done) => { + extensionRegistry + .byType('section') + .subscribe((extensions) => { + expect(extensions.length).to.eq(3); + done(); + }) + .unsubscribe(); + }); + it('should get an extension by alias', (done) => { const alias = 'Umb.Test.Section.1'; extensionRegistry - .getByTypeAndAlias('section', alias) + .byAlias(alias) .subscribe((extension) => { expect(extension?.alias).to.eq(alias); done(); @@ -77,10 +88,32 @@ describe('UmbExtensionRegistry', () => { .unsubscribe(); }); + it('should get an extension by type and alias', (done) => { + const alias = 'Umb.Test.Section.1'; + extensionRegistry + .byTypeAndAlias('section', alias) + .subscribe((extension) => { + expect(extension?.alias).to.eq(alias); + done(); + }) + .unsubscribe(); + }); + + it('should get an extension by type and filter', (done) => { + extensionRegistry + .byTypeAndFilter('section', (ext) => ext.weight === 25) + .subscribe((extensions) => { + expect(extensions.length).to.eq(1); + expect(extensions[0].alias).to.eq('Umb.Test.Section.3'); + done(); + }) + .unsubscribe(); + }); + it('should get an extension by aliases', (done) => { const aliases = ['Umb.Test.Section.1', 'Umb.Test.Section.2']; extensionRegistry - .getByTypeAndAliases('section', aliases) + .byTypeAndAliases('section', aliases) .subscribe((extensions) => { expect(extensions[0]?.alias).to.eq(aliases[1]); expect(extensions[1]?.alias).to.eq(aliases[0]); @@ -89,12 +122,12 @@ describe('UmbExtensionRegistry', () => { .unsubscribe(); }); - describe('getByType', () => { + describe('byType', () => { const type = 'section'; it('should get all extensions by type', (done) => { extensionRegistry - .extensionsOfType(type) + .byType(type) .subscribe((extensions) => { expect(extensions).to.have.lengthOf(3); expect(extensions?.[0]?.type).to.eq(type); @@ -106,7 +139,7 @@ describe('UmbExtensionRegistry', () => { it('should return extensions ordered by weight', (done) => { extensionRegistry - .extensionsOfType(type) + .byType(type) .subscribe((extensions) => { expect(extensions?.[0]?.weight).to.eq(200); expect(extensions?.[1]?.weight).to.eq(25); @@ -121,7 +154,7 @@ describe('UmbExtensionRegistry', () => { let lastAmount = 0; extensionRegistry - .extensionsOfType('section') + .byType('section') .subscribe((extensions) => { amountOfTimesTriggered++; const newAmount = extensions?.length ?? 0; @@ -169,6 +202,37 @@ describe('UmbExtensionRegistry', () => { .unsubscribe(); }); }); + + describe('byTypes', () => { + const types = ['section', 'workspace']; + + it('should get all extensions of the given types', (done) => { + extensionRegistry + .byTypes(types) + .subscribe((extensions) => { + expect(extensions).to.have.lengthOf(4); + expect(extensions?.[0]?.type).to.eq('section'); + expect(extensions?.[1]?.type).to.eq('section'); + expect(extensions?.[2]?.type).to.eq('workspace'); + expect(extensions?.[3]?.type).to.eq('section'); + done(); + }) + .unsubscribe(); + }); + + it('should return extensions ordered by weight', (done) => { + extensionRegistry + .byTypes(types) + .subscribe((extensions) => { + expect(extensions?.[0]?.weight).to.eq(200); + expect(extensions?.[1]?.weight).to.eq(25); + expect(extensions?.[2]?.weight).to.eq(2); + expect(extensions?.[3]?.weight).to.eq(1); + done(); + }) + .unsubscribe(); + }); + }); }); describe('UmbExtensionRegistry with kinds', () => { @@ -244,7 +308,7 @@ describe('UmbExtensionRegistry with kinds', () => { it('should merge with kinds', (done) => { extensionRegistry - .extensionsOfType('section') + .byType('section') .subscribe((extensions) => { expect(extensions).to.have.lengthOf(3); expect(extensions?.[0]?.elementName).to.not.eq('my-kind-element'); @@ -265,7 +329,7 @@ describe('UmbExtensionRegistry with kinds', () => { extensionRegistry.unregister('Umb.Test.Kind'); extensionRegistry - .extensionsOfType('section') + .byType('section') .subscribe((extensions) => { amountOfTimesTriggered++; expect(extensions).to.have.lengthOf(3); @@ -287,7 +351,7 @@ describe('UmbExtensionRegistry with kinds', () => { let amountOfTimesTriggered = -1; extensionRegistry - .extensionsOfType('section') + .byType('section') .subscribe((extensions) => { amountOfTimesTriggered++; expect(extensions).to.have.lengthOf(3); diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts index 42a12a07e0..4729708047 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts @@ -1,14 +1,8 @@ import type { ManifestBase, ManifestKind } from '../types/index.js'; -import { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js'; +import type { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js'; import { UmbBasicState } from '@umbraco-cms/backoffice/observable-api'; -import { - map, - Observable, - distinctUntilChanged, - combineLatest, - of, - switchMap, -} from '@umbraco-cms/backoffice/external/rxjs'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import { map, distinctUntilChanged, combineLatest, of, switchMap } from '@umbraco-cms/backoffice/external/rxjs'; function extensionArrayMemoization>( previousValue: Array, @@ -108,21 +102,21 @@ export class UmbExtensionRegistry< ), ); nextData.push(kind as ManifestKind); - this._kinds.next(nextData); + this._kinds.setValue(nextData); } register(manifest: ManifestTypes | ManifestKind): void { - const isValid = this.checkExtension(manifest); + const isValid = this.#checkExtension(manifest); if (!isValid) { return; } - this._extensions.next([...this._extensions.getValue(), manifest as ManifestTypes]); + this._extensions.setValue([...this._extensions.getValue(), manifest as ManifestTypes]); } registerMany(manifests: Array>): void { - const validManifests = manifests.filter(this.checkExtension.bind(this)); - this._extensions.next([...this._extensions.getValue(), ...(validManifests as Array)]); + // we have to register extensions individually, so we ensure a manifest is valid before continuing to the next one + manifests.forEach((manifest) => this.register(manifest)); } unregisterMany(aliases: Array): void { @@ -133,8 +127,8 @@ export class UmbExtensionRegistry< const newKindsValues = this._kinds.getValue().filter((kind) => kind.alias !== alias); const newExtensionsValues = this._extensions.getValue().filter((extension) => extension.alias !== alias); - this._kinds.next(newKindsValues); - this._extensions.next(newExtensionsValues); + this._kinds.setValue(newKindsValues); + this._extensions.setValue(newExtensionsValues); } isRegistered(alias: string): boolean { @@ -149,14 +143,7 @@ export class UmbExtensionRegistry< return false; } - /* - getByAlias(alias: string) { - // TODO: make pipes prettier/simpler/reuseable - return this.extensions.pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null)); - } - */ - - private checkExtension(manifest: ManifestTypes | ManifestKind): boolean { + #checkExtension(manifest: ManifestTypes | ManifestKind): boolean { if (!manifest.type) { console.error(`Extension is missing type`, manifest); return false; @@ -183,19 +170,23 @@ export class UmbExtensionRegistry< return true; } - private _kindsOfType | string>(type: Key) { + #kindsOfType | string>(type: Key) { return this.kinds.pipe( map((kinds) => kinds.filter((kind) => kind.matchType === type)), distinctUntilChanged(extensionArrayMemoization), ); } - private _extensionsOfType | string>(type: Key) { + + #extensionsOfType< + Key extends keyof ManifestTypeMap | string, + T extends ManifestBase = SpecificManifestTypeOrManifestBase, + >(type: Key) { return this.extensions.pipe( - map((exts) => exts.filter((ext) => ext.type === type)), + map((exts) => exts.filter((ext) => ext.type === type) as unknown as T[]), distinctUntilChanged(extensionArrayMemoization), ); } - private _kindsOfTypes(types: string[]) { + #kindsOfTypes(types: string[]) { return this.kinds.pipe( map((kinds) => kinds.filter((kind) => types.indexOf(kind.matchType) !== -1)), distinctUntilChanged(extensionArrayMemoization), @@ -203,39 +194,67 @@ export class UmbExtensionRegistry< } // TODO: can we get rid of as unknown here - private _extensionsOfTypes( + #extensionsOfTypes( types: Array, ): Observable> { return this.extensions.pipe( - map((exts) => exts.filter((ext) => types.indexOf(ext.type) !== -1)), + map((exts) => exts.filter((ext) => types.indexOf(ext.type) !== -1) as unknown as Array), distinctUntilChanged(extensionArrayMemoization), - ) as unknown as Observable>; + ); } - getByAlias(alias: string) { + #mergeExtensionWithKinds>([ + ext, + kinds, + ]: [ExtensionType | undefined, Array]): ExtensionType | undefined { + // Specific Extension Meta merge (does not merge conditions) + if (ext) { + // Since we don't have the type up front in this request, we will just get all kinds here and find the matching one: + const baseManifest = kinds.find((kind) => kind.matchKind === ext.kind)?.manifest; + // TODO: This check can go away when making a find kind based on type and kind. + if (baseManifest) { + const merged = { __isMatchedWithKind: true, ...baseManifest, ...ext }; + if ((baseManifest as any).meta) { + (merged as any).meta = { ...(baseManifest as any).meta, ...(ext as any).meta }; + } + return merged as ExtensionType; + } + } + return ext; + } + + #mergeExtensionsWithKinds>([ + exts, + kinds, + ]: [Array, Array]): ExtensionType[] { + return exts + .map((ext) => { + // Specific Extension Meta merge (does not merge conditions) + const baseManifest = kinds.find((kind) => kind.matchKind === ext.kind)?.manifest; + if (baseManifest) { + const merged = { __isMatchedWithKind: true, ...baseManifest, ...ext } as any; + if ((baseManifest as any).meta) { + merged.meta = { ...(baseManifest as any).meta, ...(ext as any).meta }; + } + return merged; + } + return ext; + }) + .sort(sortExtensions); + } + + /** + * Get an observable that provides extensions matching the given alias. + * @param alias {string} - The alias of the extensions to get. + * @returns {Observable} - An observable of the extension that matches the alias. + */ + byAlias(alias: string) { return this.extensions.pipe( map((exts) => exts.find((ext) => ext.alias === alias)), distinctUntilChanged(extensionSingleMemoization), switchMap((ext) => { if (ext?.kind) { - return this._kindsOfType(ext.type).pipe( - map((kinds) => { - // Specific Extension Meta merge (does not merge conditions) - if (ext) { - // Since we dont have the type up front in this request, we will just get all kinds here and find the matching one: - const baseManifest = kinds.find((kind) => kind.matchKind === ext.kind)?.manifest; - // TODO: This check can go away when making a find kind based on type and kind. - if (baseManifest) { - const merged = { __isMatchedWithKind: true, ...baseManifest, ...ext } as any; - if ((baseManifest as any).meta) { - merged.meta = { ...(baseManifest as any).meta, ...(ext as any).meta }; - } - return merged; - } - } - return ext; - }), - ); + return this.#kindsOfType(ext.type).pipe(map((kinds) => this.#mergeExtensionWithKinds([ext, kinds]))); } return of(ext); }), @@ -243,8 +262,18 @@ export class UmbExtensionRegistry< distinctUntilChanged(extensionAndKindMatchSingleMemoization), ) as Observable; } + /** + * @deprecated Use `byAlias` instead. + */ + getByAlias = this.byAlias.bind(this); - getByTypeAndAlias< + /** + * Get an observable that provides extensions matching the given type and alias. + * @param type {string} - The type of the extensions to get. + * @param alias {string} - The alias of the extensions to get. + * @returns {Observable} - An observable of the extensions that matches the type and alias. + */ + byTypeAndAlias< Key extends keyof ManifestTypeMap | string, T extends ManifestBase = SpecificManifestTypeOrManifestBase, >(type: Key, alias: string) { @@ -253,106 +282,94 @@ export class UmbExtensionRegistry< map((exts) => exts.find((ext) => ext.type === type && ext.alias === alias)), distinctUntilChanged(extensionSingleMemoization), ), - this._kindsOfType(type), + this.#kindsOfType(type), ]).pipe( - map(([ext, kinds]) => { - // TODO: share one merge function between the different methods of this class: - // Specific Extension Meta merge (does not merge conditions) - if (ext) { - const baseManifest = kinds.find((kind) => kind.matchKind === ext.kind)?.manifest; - if (baseManifest) { - const merged = { __isMatchedWithKind: true, ...baseManifest, ...ext } as any; - if ((baseManifest as any).meta) { - merged.meta = { ...(baseManifest as any).meta, ...(ext as any).meta }; - } - return merged; - } - } - return ext; - }), + map(this.#mergeExtensionWithKinds), distinctUntilChanged(extensionAndKindMatchSingleMemoization), ) as Observable; } + /** + * @deprecated Use `byTypeAndAlias` instead. + */ + getByTypeAndAlias = this.byTypeAndAlias.bind(this); - getByTypeAndAliases< + byTypeAndAliases< Key extends keyof ManifestTypeMap | string, T extends ManifestBase = SpecificManifestTypeOrManifestBase, >(type: Key, aliases: Array) { return combineLatest([ this.extensions.pipe( - map((exts) => exts.filter((ext) => ext.type === type && aliases.indexOf(ext.alias) !== -1)), + map((exts) => exts.filter((ext) => ext.type === type && aliases.indexOf(ext.alias) !== -1) as unknown as T[]), distinctUntilChanged(extensionArrayMemoization), ), - this._kindsOfType(type), + this.#kindsOfType(type), ]).pipe( - map(([exts, kinds]) => - exts - .map((ext) => { - // Specific Extension Meta merge (does not merge conditions) - const baseManifest = kinds.find((kind) => kind.matchKind === ext.kind)?.manifest; - if (baseManifest) { - const merged = { __isMatchedWithKind: true, ...baseManifest, ...ext } as any; - if ((baseManifest as any).meta) { - merged.meta = { ...(baseManifest as any).meta, ...(ext as any).meta }; - } - return merged; - } - return ext; - }) - .sort(sortExtensions), + map(this.#mergeExtensionsWithKinds), + distinctUntilChanged(extensionAndKindMatchArrayMemoization), + ) as Observable>; + } + /** + * @deprecated Use `byTypeAndAliases` instead. + */ + getByTypeAndAliases = this.byTypeAndAliases.bind(this); + + /** + * Get an observable of extensions by type and a given filter method. + * This will return the all extensions that matches the type and which filter method returns true. + * The filter method will be called for each extension manifest of the given type, and the first argument to it is the extension manifest. + * @param type {string} - The type of the extension to get + * @param filter {(ext: T): void} - The filter method to use to filter the extensions + * @returns {Observable>} - An observable of the extensions that matches the type and filter method + */ + byTypeAndFilter< + Key extends keyof ManifestTypeMap | string, + T extends ManifestBase = SpecificManifestTypeOrManifestBase, + >(type: Key, filter: (ext: T) => boolean) { + return combineLatest([ + this.extensions.pipe( + map((exts) => exts.filter((ext) => ext.type === type && filter(ext as unknown as T)) as unknown as T[]), + distinctUntilChanged(extensionArrayMemoization), ), + this.#kindsOfType(type), + ]).pipe( + map(this.#mergeExtensionsWithKinds), distinctUntilChanged(extensionAndKindMatchArrayMemoization), ) as Observable>; } - extensionsOfType< + /** + * Get an observable that provides extensions matching the given type. + * @param type {string} - The type of the extensions to get. + * @returns {Observable} - An observable of the extensions that matches the type. + */ + byType< Key extends keyof ManifestTypeMap | string, T extends ManifestBase = SpecificManifestTypeOrManifestBase, >(type: Key) { - return combineLatest([this._extensionsOfType(type), this._kindsOfType(type)]).pipe( - map(([exts, kinds]) => - exts - .map((ext) => { - // Specific Extension Meta merge (does not merge conditions) - const baseManifest = kinds.find((kind) => kind.matchKind === ext.kind)?.manifest; - if (baseManifest) { - const merged = { __isMatchedWithKind: true, ...baseManifest, ...ext } as any; - if ((baseManifest as any).meta) { - merged.meta = { ...(baseManifest as any).meta, ...(ext as any).meta }; - } - return merged; - } - return ext; - }) - .sort(sortExtensions), - ), + return combineLatest([this.#extensionsOfType(type), this.#kindsOfType(type)]).pipe( + map(this.#mergeExtensionsWithKinds), distinctUntilChanged(extensionAndKindMatchArrayMemoization), ) as Observable>; } + /** + * @deprecated Use `byType` instead. + */ + extensionsOfType = this.byType.bind(this); - extensionsOfTypes( - types: string[], - ): Observable> { - return combineLatest([this._extensionsOfTypes(types), this._kindsOfTypes(types)]).pipe( - map(([exts, kinds]) => - exts - .map((ext) => { - // Specific Extension Meta merge (does not merge conditions) - if (ext) { - const baseManifest = kinds.find((kind) => kind.matchKind === ext.kind)?.manifest; - if (baseManifest) { - const merged = { __isMatchedWithKind: true, ...baseManifest, ...ext } as any; - if ((baseManifest as any).meta) { - merged.meta = { ...(baseManifest as any).meta, ...(ext as any).meta }; - } - return merged; - } - } - return ext; - }) - .sort(sortExtensions), - ), + /** + * Get an observable that provides extensions matching given types. + * @param type {Array} - The types of the extensions to get. + * @returns {Observable} - An observable of the extensions that matches the types. + */ + byTypes(types: string[]): Observable> { + return combineLatest([this.#extensionsOfTypes(types), this.#kindsOfTypes(types)]).pipe( + map(this.#mergeExtensionsWithKinds), distinctUntilChanged(extensionAndKindMatchArrayMemoization), ) as Observable>; } + + /** + * @deprecated Use `byTypes` instead. + */ + extensionsOfTypes = this.byTypes.bind(this); } diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts index 0f691deadf..5527ef1f2d 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts @@ -1,3 +1,3 @@ -export * from './localize.controller.js'; +export * from './localization.controller.js'; export * from './types/localization.js'; -export * from './manager.js'; +export * from './localization.manager.js'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.test.ts similarity index 69% rename from src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts rename to src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.test.ts index fe57d093ef..9df2003229 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.test.ts @@ -1,16 +1,31 @@ import { aTimeout, elementUpdated, expect, fixture, html } from '@open-wc/testing'; -import { DefaultLocalizationSet, LocalizationSet, registerLocalization, localizations } from './manager.js'; -import { UmbLocalizeController } from './localize.controller.js'; +import type { UmbLocalizationSet, UmbLocalizationSetBase } from './localization.manager.js'; +import { umbLocalizationManager } from './localization.manager.js'; +import { UmbLocalizationController } from './localization.controller.js'; import { LitElement, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @customElement('umb-localize-controller-host') class UmbLocalizeControllerHostElement extends UmbElementMixin(LitElement) { @property() lang = 'en-us'; } -interface TestLocalization extends LocalizationSet { +@customElement('umb-localization-render-count') +class UmbLocalizationRenderCountElement extends UmbElementMixin(LitElement) { + amountOfUpdates = 0; + + requestUpdate() { + super.requestUpdate(); + this.amountOfUpdates++; + } + + render() { + return html`${this.localize.term('logout')}`; + } +} + +interface TestLocalization extends UmbLocalizationSetBase { close: string; logout: string; withInlineToken: any; @@ -35,20 +50,26 @@ const english: TestLocalization = { }, }; -const englishOverride: DefaultLocalizationSet = { +const englishOverride: UmbLocalizationSet = { $code: 'en-us', $dir: 'ltr', close: 'Close 2', }; -const danish: DefaultLocalizationSet = { +const englishOverrideLogout: UmbLocalizationSet = { + $code: 'en-us', + $dir: 'ltr', + logout: 'Log out 2', +}; + +const danish: UmbLocalizationSet = { $code: 'da', $dir: 'ltr', close: 'Luk', notOnRegional: 'Not on regional', }; -const danishRegional: DefaultLocalizationSet = { +const danishRegional: UmbLocalizationSet = { $code: 'da-dk', $dir: 'ltr', close: 'Luk', @@ -56,10 +77,10 @@ const danishRegional: DefaultLocalizationSet = { //#endregion describe('UmbLocalizeController', () => { - let controller: UmbLocalizeController; + let controller: UmbLocalizationController; beforeEach(async () => { - registerLocalization(english, danish, danishRegional); + umbLocalizationManager.registerManyLocalizations([english, danish, danishRegional]); document.documentElement.lang = english.$code; document.documentElement.dir = english.$dir; await aTimeout(0); @@ -71,12 +92,12 @@ describe('UmbLocalizeController', () => { getControllers: () => [], removeControllerByAlias: () => {}, } satisfies UmbControllerHost; - controller = new UmbLocalizeController(host); + controller = new UmbLocalizationController(host); }); afterEach(() => { controller.destroy(); - localizations.clear(); + umbLocalizationManager.localizations.clear(); }); it('should have a default language', () => { @@ -129,9 +150,9 @@ describe('UmbLocalizeController', () => { expect(controller.term('logout')).to.equal('Log out'); // Fallback }); - it('should override a term if new translation is registered', () => { + it('should override a term if new localization is registered', () => { // Let the registry load the new extension - registerLocalization(englishOverride); + umbLocalizationManager.registerLocalization(englishOverride); expect(controller.term('close')).to.equal('Close 2'); }); @@ -151,6 +172,42 @@ describe('UmbLocalizeController', () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any expect((controller.term as any)('logout', 'Hello', 'World')).to.equal('Log out'); }); + + it('only reacts to changes of its own localization-keys', async () => { + const element: UmbLocalizationRenderCountElement = await fixture( + html``, + ); + + // Something triggers multiple updates initially, and it varies how many it is. So we wait for a timeout to ensure that we have a clean slate and then reset the counter: + await aTimeout(20); + element.amountOfUpdates = 0; + + expect(element.shadowRoot!.textContent).to.equal('Log out'); + + // Let the registry load the new extension + umbLocalizationManager.registerLocalization(englishOverride); + + // Wait three frames is safe: + await new Promise((resolve) => requestAnimationFrame(resolve)); + await new Promise((resolve) => requestAnimationFrame(resolve)); + await new Promise((resolve) => requestAnimationFrame(resolve)); + + // This should still be the same (cause it should not be affected as the change did not change our localization key) + expect(element.amountOfUpdates).to.equal(0); + expect(element.shadowRoot!.textContent).to.equal('Log out'); + + // Let the registry load the new extension + umbLocalizationManager.registerLocalization(englishOverrideLogout); + + // Wait three frames is safe: + await new Promise((resolve) => requestAnimationFrame(resolve)); + await new Promise((resolve) => requestAnimationFrame(resolve)); + await new Promise((resolve) => requestAnimationFrame(resolve)); + + // Now we should have gotten one update and the text should be different + expect(element.amountOfUpdates).to.equal(1); + expect(element.shadowRoot!.textContent).to.equal('Log out 2'); + }); }); describe('date', () => { @@ -225,7 +282,7 @@ describe('UmbLocalizeController', () => { }); it('should have a localize controller', () => { - expect(element.localize).to.be.instanceOf(UmbLocalizeController); + expect(element.localize).to.be.instanceOf(UmbLocalizationController); }); it('should update the term when the language changes', async () => { diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts rename to src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts index ee09d487b5..767370df80 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts @@ -11,19 +11,17 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { - DefaultLocalizationSet, +import type { + UmbLocalizationSet, FunctionParams, - LocalizationSet, - connectedElements, - documentDirection, - documentLanguage, - fallback, - localizations, -} from './manager.js'; -import { UmbController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + UmbLocalizationSetBase, + UmbLocalizationSetKey, +} from './localization.manager.js'; +import { umbLocalizationManager } from './localization.manager.js'; +import type { LitElement } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -const LocalizeControllerAlias = Symbol(); +const LocalizationControllerAlias = Symbol(); /** * The UmbLocalizeController enables localization for your element. * @@ -42,12 +40,13 @@ const LocalizeControllerAlias = Symbol(); * } * ``` */ -export class UmbLocalizeController +export class UmbLocalizationController implements UmbController { #host; - #hostEl; - controllerAlias = LocalizeControllerAlias; + #hostEl?: HTMLElement & Partial>; + readonly controllerAlias = LocalizationControllerAlias; + #usedKeys = new Array(); constructor(host: UmbControllerHost) { this.#host = host; @@ -56,15 +55,11 @@ export class UmbLocalizeController) { + const hasOneOfTheseKeys = this.#usedKeys.find((key) => changedKeys.has(key)); + + if (hasOneOfTheseKeys) { + this.#hostEl?.requestUpdate?.(); + } + } + /** * Gets the host element's directionality as determined by the `dir` attribute. The return value is transformed to * lowercase. */ dir() { - return `${this.#hostEl.dir || documentDirection}`.toLowerCase(); + return `${this.#hostEl?.dir || umbLocalizationManager.documentDirection}`.toLowerCase(); } /** @@ -85,21 +92,25 @@ export class UmbLocalizeControllerlocalizations.get(`${language}-${region}`); - const secondary = localizations.get(language); + const primary = umbLocalizationManager.localizations.get(`${language}-${region}`) as LocalizationSetType; + const secondary = umbLocalizationManager.localizations.get(language) as LocalizationSetType; return { locale, language, region, primary, secondary }; } /** Outputs a translated term. */ - term(key: K, ...args: FunctionParams): string { + term(key: K, ...args: FunctionParams): string { + if (!this.#usedKeys.includes(key)) { + this.#usedKeys.push(key); + } + const { primary, secondary } = this.getLocalizationData(this.lang()); let term: any; @@ -108,8 +119,8 @@ export class UmbLocalizeController = T extends (...args: infer U) => string ? U : []; + +export interface UmbLocalizationSetBase { + $code: string; // e.g. en, en-GB + $dir: 'ltr' | 'rtl'; +} + +export type UmbLocalizationSetKey = string | number | symbol; + +export interface UmbLocalizationSet extends UmbLocalizationSetBase { + [key: UmbLocalizationSetKey]: UmbLocalizationEntry; +} + +export const UMB_DEFAULT_LOCALIZATION_CULTURE = 'en-us'; + +export class UmbLocalizationManager { + connectedControllers = new Set>(); + #documentElementObserver: MutationObserver; + + #changedKeys: Set = new Set(); + #requestUpdateChangedKeysId?: number = undefined; + + localizations: Map = new Map(); + documentDirection = document.documentElement.dir || 'ltr'; + documentLanguage = document.documentElement.lang || navigator.language; + + get fallback(): UmbLocalizationSet | undefined { + return this.localizations.get(UMB_DEFAULT_LOCALIZATION_CULTURE) as UmbLocalizationSet; + } + + constructor() { + this.#documentElementObserver = new MutationObserver(this.updateAll); + this.#documentElementObserver.observe(document.documentElement, { + attributes: true, + attributeFilter: ['dir', 'lang'], + }); + } + + appendConsumer(consumer: UmbLocalizationController) { + if (this.connectedControllers.has(consumer)) return; + this.connectedControllers.add(consumer); + } + removeConsumer(consumer: UmbLocalizationController) { + this.connectedControllers.delete(consumer); + } + + /** Registers one or more translations */ + registerLocalization(t: UmbLocalizationSetBase) { + const code = t.$code.toLowerCase(); + + if (this.localizations.has(code)) { + // Merge translations that share the same language code + this.localizations.set(code, { ...this.localizations.get(code), ...t }); + } else { + this.localizations.set(code, t); + } + + // Declare what keys have been changed: + const keys = Object.keys(t); + for (const key of keys) { + this.#changedKeys.add(key); + } + this.#requestChangedKeysUpdate(); + } + #registerLocalizationBind = this.registerLocalization.bind(this); + + registerManyLocalizations(translations: Array) { + translations.map(this.#registerLocalizationBind); + } + + /** Updates all localized elements that are currently connected */ + updateAll = () => { + const newDir = document.documentElement.dir || 'ltr'; + const newLang = document.documentElement.lang || navigator.language; + + if (this.documentDirection === newDir && this.documentLanguage === newLang) return; + + // The document direction or language did changed, so lets move on: + this.documentDirection = newDir; + this.documentLanguage = newLang; + + // Check if there was any changed. + this.connectedControllers.forEach((ctrl) => { + ctrl.documentUpdate(); + }); + + if (this.#requestUpdateChangedKeysId) { + cancelAnimationFrame(this.#requestUpdateChangedKeysId); + this.#requestUpdateChangedKeysId = undefined; + } + this.#changedKeys.clear(); + }; + + #updateChangedKeys = () => { + this.#requestUpdateChangedKeysId = undefined; + + this.connectedControllers.forEach((ctrl) => { + ctrl.keysChanged(this.#changedKeys); + }); + + this.#changedKeys.clear(); + }; + + /** + * Request an update of all consumers of the keys defined in #changedKeys. + * This waits one frame, which ensures that multiple changes are collected into one. + */ + #requestChangedKeysUpdate() { + if (this.#requestUpdateChangedKeysId) return; + this.#requestUpdateChangedKeysId = requestAnimationFrame(this.#updateChangedKeys); + } +} + +export const umbLocalizationManager = new UmbLocalizationManager(); diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts deleted file mode 100644 index 6148e0f52c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* -This module is a modified copy of the original Shoelace localize package: https://github.com/shoelace-style/localize - -The original license is included below. - -Copyright (c) 2020 A Beautiful Site, LLC - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -import type { UmbLocalizationEntry } from './types/localization.js'; -import type { LitElement } from '@umbraco-cms/backoffice/external/lit'; - -export type FunctionParams = T extends (...args: infer U) => string ? U : []; - -export interface LocalizationSet { - $code: string; // e.g. en, en-GB - $dir: 'ltr' | 'rtl'; -} - -export interface DefaultLocalizationSet extends LocalizationSet { - [key: string]: UmbLocalizationEntry; -} - -export const connectedElements = new Set(); -const documentElementObserver = new MutationObserver(update); -export const localizations: Map = new Map(); -export let documentDirection = document.documentElement.dir || 'ltr'; -export let documentLanguage = document.documentElement.lang || navigator.language; -export let fallback: LocalizationSet; - -// Watch for changes on -documentElementObserver.observe(document.documentElement, { - attributes: true, - attributeFilter: ['dir', 'lang'], -}); - -/** Registers one or more translations */ -export function registerLocalization(...translation: LocalizationSet[]) { - translation.map((t) => { - const code = t.$code.toLowerCase(); - - if (localizations.has(code)) { - // Merge translations that share the same language code - localizations.set(code, { ...localizations.get(code), ...t }); - } else { - localizations.set(code, t); - } - - // The first translation that's registered is the fallback - if (!fallback) { - fallback = t; - } - }); - - update(); -} - -/** Updates all localized elements that are currently connected */ -export function update() { - documentDirection = document.documentElement.dir || 'ltr'; - documentLanguage = document.documentElement.lang || navigator.language; - - [...connectedElements.keys()].map((el) => { - if (typeof (el as LitElement).requestUpdate === 'function') { - // TODO: We might want to implement a specific Umbraco method for informing about this. and then make the default UmbLitElement call requestUpdate..? Cause then others can implement their own solution? - (el as LitElement).requestUpdate(); - } - }); -} diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.test.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.test.ts index 5a84862c5e..b34e72d63e 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.test.ts @@ -48,6 +48,6 @@ describe('UmbObserver', () => { }); expect(count).to.be.equal(1); - lateSubject.next(initialData); + lateSubject.setValue(initialData); }); }); diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts index 18105e8b4e..dad7fbb4c5 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts @@ -1,4 +1,4 @@ -import { Observable, Subscription } from '@umbraco-cms/backoffice/external/rxjs'; +import type { Observable, Subscription } from '@umbraco-cms/backoffice/external/rxjs'; export type ObserverCallbackStack = { next: (_value: T) => void; diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts index 00e6bd5eb7..402cb2b4f5 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts @@ -1,4 +1,5 @@ import { partialUpdateFrozenArray } from '../utils/partial-update-frozen-array.function.js'; +import { pushAtToUniqueArray } from '../utils/push-at-to-unique-array.function.js'; import { pushToUniqueArray } from '../utils/push-to-unique-array.function.js'; import { UmbDeepState } from './deep-state.js'; @@ -22,7 +23,7 @@ export class UmbArrayState extends UmbDeepState { /** * @method sortBy - * @param {(a: T, b: T) => number} sortMethod - A method to be used for sorting everytime data is set. + * @param {(a: T, b: T) => number} sortMethod - A method to be used for sorting every time data is set. * @description - A sort method to this Subject. * @example Example add sort method * const data = [ @@ -37,14 +38,29 @@ export class UmbArrayState extends UmbDeepState { return this; } - next(value: T[]) { + /** + * @method setValue + * @param {T} data - The next data for this state to hold. + * @description - Set the data of this state, if sortBy has been defined for this state the data will be sorted before set. If data is different than current this will trigger observations to update. + * @example Example change the data of a state + * const myState = new UmbArrayState('Good morning'); + * // myState.value is equal 'Good morning'. + * myState.setValue('Goodnight') + * // myState.value is equal 'Goodnight'. + */ + setValue(value: T[]) { if (this.#sortMethod) { - super.next(value.sort(this.#sortMethod)); + super.setValue(value.sort(this.#sortMethod)); } else { - super.next(value); + super.setValue(value); } } + /** + * @deprecated - Use `setValue` instead. + */ + next = this.setValue; + /** * @method remove * @param {unknown[]} uniques - The unique values to remove. @@ -69,7 +85,7 @@ export class UmbArrayState extends UmbDeepState { }); }); - this.next(next); + this.setValue(next); } return this; } @@ -96,7 +112,7 @@ export class UmbArrayState extends UmbDeepState { return this.getUniqueMethod(x) !== unique; }); - this.next(next); + this.setValue(next); } return this; } @@ -123,7 +139,7 @@ export class UmbArrayState extends UmbDeepState { * */ filter(predicate: (value: T, index: number, array: T[]) => boolean) { - this.next(this.getValue().filter(predicate)); + this.setValue(this.getValue().filter(predicate)); return this; } @@ -147,7 +163,34 @@ export class UmbArrayState extends UmbDeepState { } else { next.push(entry); } - this.next(next); + this.setValue(next); + return this; + } + + /** + * @method appendOneAt + * @param {T} entry - new data to be added in this Subject. + * @param {T} index - index of where to append this data into the Subject. + * @return {UmbArrayState} Reference to it self. + * @description - Append some new data to this Subject. + * @example Example append some data. + * const data = [ + * { key: 1, value: 'foo'}, + * { key: 3, value: 'bar'} + * ]; + * const myState = new UmbArrayState(data); + * myState.appendOneAt({ key: 2, value: 'in-between'}, 1); + */ + appendOneAt(entry: T, index: number) { + const next = [...this.getValue()]; + if (this.getUniqueMethod) { + pushAtToUniqueArray(next, entry, this.getUniqueMethod, index); + } else if (index === -1 || index >= next.length) { + next.push(entry); + } else { + next.splice(index, 0, entry); + } + this.setValue(next); return this; } @@ -173,9 +216,9 @@ export class UmbArrayState extends UmbDeepState { entries.forEach((entry) => { pushToUniqueArray(next, entry, this.getUniqueMethod!); }); - this.next(next); + this.setValue(next); } else { - this.next([...this.getValue(), ...entries]); + this.setValue([...this.getValue(), ...entries]); } return this; } @@ -198,7 +241,7 @@ export class UmbArrayState extends UmbDeepState { if (!this.getUniqueMethod) { throw new Error("Can't partial update an ArrayState without a getUnique method provided when constructed."); } - this.next(partialUpdateFrozenArray(this.getValue(), entry, (x) => unique === this.getUniqueMethod!(x))); + this.setValue(partialUpdateFrozenArray(this.getValue(), entry, (x) => unique === this.getUniqueMethod!(x))); return this; } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/basic-state.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/basic-state.ts index fe3e9ae7a2..17a2f35810 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/basic-state.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/basic-state.ts @@ -30,7 +30,7 @@ export class UmbBasicState { * @description - Holds the current data of this state. * @example Example retrieve the current data of a state * const myState = new UmbArrayState('Hello world'); - * console.log("Value is: ", myState.getValue()); + * console.log("Value is: ", myState.value); */ public get value(): BehaviorSubject['value'] { return this._subject.value; @@ -57,18 +57,23 @@ export class UmbBasicState { } /** - * @method next - * @param {T} data - The next set of data for this state to hold. + * @method setValue + * @param {T} data - The next data for this state to hold. * @description - Set the data of this state, if data is different than current this will trigger observations to update. - * @example Example retrieve the current data of a state + * @example Example change the data of a state * const myState = new UmbArrayState('Good morning'); * // myState.value is equal 'Good morning'. - * myState.next('Goodnight') + * myState.setValue('Goodnight') * // myState.value is equal 'Goodnight'. */ - next(newData: T): void { - if (newData !== this._subject.getValue()) { - this._subject.next(newData); + setValue(data: T): void { + if (data !== this._subject.getValue()) { + this._subject.next(data); } } + + /** + * @deprecated - Use `setValue` instead. + */ + next = this.setValue; } diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/class-state.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/class-state.ts index 69695deecd..b939bb3bf6 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/class-state.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/class-state.ts @@ -15,10 +15,15 @@ export class UmbClassState extends UmbB super(initialData); } - next(newData: T): void { + /** + * @method setValue + * @param {T} data - The next data for this state to hold. + * @description - Set the data of this state, if data is different than current this will trigger observations to update. + */ + setValue(data: T): void { const oldValue = this._subject.getValue(); - if (newData && oldValue?.equal(newData)) return; - this._subject.next(newData); + if (data && oldValue?.equal(data)) return; + this._subject.next(data); } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/deep-state.test.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/deep-state.test.ts index 99faba0457..8bd731d589 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/deep-state.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/deep-state.test.ts @@ -17,7 +17,7 @@ describe('UmbDeepState', () => { }); it('update via next', () => { - subject.next({ key: 'some', another: 'myNewValue' }); + subject.setValue({ key: 'some', another: 'myNewValue' }); expect(subject.getValue().another).to.be.equal('myNewValue'); }); @@ -47,7 +47,7 @@ describe('UmbDeepState', () => { } }); - subject.next({ key: 'change_this_first_should_not_trigger_update', another: 'myValue' }); - subject.next({ key: 'some', another: 'myNewValue' }); + subject.setValue({ key: 'change_this_first_should_not_trigger_update', another: 'myValue' }); + subject.setValue({ key: 'some', another: 'myNewValue' }); }); }); diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/deep-state.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/deep-state.ts index 1a3a85b1a3..77847a848d 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/deep-state.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/deep-state.ts @@ -24,8 +24,13 @@ export class UmbDeepState extends UmbBasicState { return createObservablePart(this._subject, mappingFunction, memoizationFunction); } - next(newData: T): void { - const frozenData = deepFreeze(newData); + /** + * @method setValue + * @param {T} data - The next data for this state to hold. + * @description - Set the data of this state, if data is different than current this will trigger observations to update. + */ + setValue(data: T): void { + const frozenData = deepFreeze(data); // Only update data if its different than current data. if (!naiveObjectComparison(frozenData, this._subject.getValue())) { this._subject.next(frozenData); diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/object-state.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/object-state.ts index 7eb00528b4..815bee0865 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/object-state.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/object-state.ts @@ -21,7 +21,7 @@ export class UmbObjectState extends UmbDeepState { * myState.update({value: 'myNewValue'}); */ update(partialData: Partial) { - this.next({ ...this._subject.getValue(), ...partialData }); + this.setValue({ ...this._subject.getValue(), ...partialData }); return this; } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/string-state.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/string-state.ts index d893e5b8ce..03c38f7a33 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/string-state.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/string-state.ts @@ -1,3 +1,4 @@ +import { createObservablePart, type MappingFunction, type MemoizationFunction } from '../index.js'; import { UmbBasicState } from './basic-state.js'; /** @@ -10,4 +11,11 @@ export class UmbStringState extends UmbBasicState { constructor(initialData: T | string) { super(initialData); } + + asObservablePart( + mappingFunction: MappingFunction, + memoizationFunction?: MemoizationFunction, + ) { + return createObservablePart(this._subject, mappingFunction, memoizationFunction); + } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/create-observable-part.function.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/create-observable-part.function.ts index eeefbf99c8..984c673935 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/create-observable-part.function.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/create-observable-part.function.ts @@ -1,7 +1,8 @@ -import { MemoizationFunction } from '../types/memoization-function.type.js'; -import { MappingFunction } from '../types/mapping-function.type.js'; +import type { MemoizationFunction } from '../types/memoization-function.type.js'; +import type { MappingFunction } from '../types/mapping-function.type.js'; import { defaultMemoization } from './default-memoization.function.js'; -import { distinctUntilChanged, map, Observable, shareReplay } from '@umbraco-cms/backoffice/external/rxjs'; +import type { Observable} from '@umbraco-cms/backoffice/external/rxjs'; +import { distinctUntilChanged, map, shareReplay } from '@umbraco-cms/backoffice/external/rxjs'; /** * @export diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/push-at-to-unique-array.function.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/push-at-to-unique-array.function.ts new file mode 100644 index 0000000000..4d27c9c0bb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/utils/push-at-to-unique-array.function.ts @@ -0,0 +1,29 @@ +/** + * @export + * @method pushToUniqueArray + * @param {T[]} data - An array of objects. + * @param {T} entry - The object to insert or replace with. + * @param {getUniqueMethod: (entry: T) => unknown} [getUniqueMethod] - Method to get the unique value of an entry. + * @description - Append or replaces an item of an Array. + * @example Example append new entry for a Array. Where the key is unique and the item will be updated if matched with existing. + * const entry = {key: 'myKey', value: 'myValue'}; + * const newDataSet = pushToUniqueArray([], entry, x => x.key === key, 1); + * mySubject.next(newDataSet); + */ +export function pushAtToUniqueArray( + data: T[], + entry: T, + getUniqueMethod: (entry: T) => unknown, + index: number, +): T[] { + const unique = getUniqueMethod(entry); + const indexToReplace = data.findIndex((x) => getUniqueMethod(x) === unique); + if (indexToReplace !== -1) { + data[indexToReplace] = entry; + } else if (index === -1 || index >= data.length) { + data.push(entry); + } else { + data.splice(index, 0, entry); + } + return data; +} 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 de02ff3fef..0cc2f7eb41 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -16,7 +16,7 @@ import { handlers as objectTypeHandlers } from './handlers/object-type/index.js' import { handlers as healthCheckHandlers } from './handlers/health-check.handlers.js'; import { handlers as profilingHandlers } from './handlers/performance-profiling.handlers.js'; import { handlers as documentHandlers } from './handlers/document/index.js'; -import { handlers as mediaHandlers } from './handlers/media.handlers.js'; +import { handlers as mediaHandlers } from './handlers/media/index.js'; import { handlers as dictionaryHandlers } from './handlers/dictionary.handlers.js'; import { handlers as mediaTypeHandlers } from './handlers/media-type/index.js'; import { handlers as memberGroupHandlers } from './handlers/member-group.handlers.js'; @@ -30,15 +30,16 @@ import { handlers as redirectManagementHandlers } from './handlers/redirect-mana import { handlers as logViewerHandlers } from './handlers/log-viewer.handlers.js'; import { handlers as packageHandlers } from './handlers/package.handlers.js'; import { handlers as rteEmbedHandlers } from './handlers/rte-embed.handlers.js'; -import { handlers as staticFileHandlers } from './handlers/static-file.handlers.js'; -import { handlers as stylesheetHandlers } from './handlers/stylesheet.handlers.js'; -import { handlers as partialViewsHandlers } from './handlers/partial-views.handlers.js'; +import { handlers as staticFileHandlers } from './handlers/static-file/index.js'; +import { handlers as stylesheetHandlers } from './handlers/stylesheet/index.js'; +import { handlers as partialViewHandlers } from './handlers/partial-view/index.js'; import { handlers as tagHandlers } from './handlers/tag-handlers.js'; import { handlers as configHandlers } from './handlers/config.handlers.js'; -import { handlers as scriptHandlers } from './handlers/scripts.handlers.js'; +import { handlers as scriptHandlers } from './handlers/script/index.js'; +import { handlers as dynamicRootHandlers } from './handlers/dynamic-root.handlers.js'; const handlers = [ - serverHandlers.serverVersionHandler, + serverHandlers.serverInformationHandler, ...auditLogHandlers, ...configHandlers, ...cultureHandlers, @@ -46,6 +47,7 @@ const handlers = [ ...dictionaryHandlers, ...documentHandlers, ...documentTypeHandlers, + ...dynamicRootHandlers, ...examineManagementHandlers, ...healthCheckHandlers, ...installHandlers, @@ -58,7 +60,7 @@ const handlers = [ ...memberTypeHandlers, ...modelsBuilderHandlers, ...packageHandlers, - ...partialViewsHandlers, + ...partialViewHandlers, ...profilingHandlers, ...publishedStatusHandlers, ...redirectManagementHandlers, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts index 6bd136e8a3..c925d90bb3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/audit-log.data.ts @@ -1,10 +1,7 @@ import { data as userData } from './user/user.data.js'; -import { data as documentData } from './document.data.js'; -import { - AuditLogResponseModel, - AuditLogWithUsernameResponseModel, - AuditTypeModel, -} from '@umbraco-cms/backoffice/backend-api'; +import { data as documentData } from './document/document.data.js'; +import type { AuditLogResponseModel, AuditLogWithUsernameResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { AuditTypeModel } from '@umbraco-cms/backoffice/backend-api'; const userId = userData[0].id; const userName = userData[0].name; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts similarity index 79% rename from src/Umbraco.Web.UI.Client/src/mocks/data/data-type.data.ts rename to src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts index 74e7646d41..c7bb12cbcf 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts @@ -1,50 +1,52 @@ -import { UmbEntityTreeData } from './entity-tree.data.js'; -import { UmbEntityData } from './entity.data.js'; -import { createFolderTreeItem } from './utils.js'; -import { UmbId } from '@umbraco-cms/backoffice/id'; import type { - FolderTreeItemResponseModel, - DataTypeResponseModel, - CreateFolderRequestModel, DataTypeItemResponseModel, + DataTypeResponseModel, + DataTypeTreeItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; -// TODO: investigate why we don't get an type as part of the DataTypeModel -export const data: Array = [ +export type UmbMockDataTypeModelHack = DataTypeResponseModel & + DataTypeTreeItemResponseModel & + DataTypeItemResponseModel; + +export interface UmbMockDataTypeModel extends Omit {} + +export const data: Array = [ { - type: 'data-type', name: 'Folder 1', id: 'dt-folder1', - parentId: null, + parent: null, isFolder: true, hasChildren: false, - isContainer: false, + editorAlias: '', + values: [], }, { - type: 'data-type', name: 'Folder 2', id: 'dt-folder2', - parentId: null, + parent: null, isFolder: true, hasChildren: true, - isContainer: false, + editorAlias: '', + values: [], }, { - type: 'data-type', id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', - parentId: null, + parent: null, name: 'Textstring', editorAlias: 'Umbraco.TextBox', editorUiAlias: 'Umb.PropertyEditorUi.TextBox', values: [], + hasChildren: false, + isFolder: false, }, { - type: 'data-type', name: 'Text', id: 'dt-textBox', - parentId: null, + parent: null, editorAlias: 'Umbraco.TextBox', editorUiAlias: 'Umb.PropertyEditorUi.TextBox', + hasChildren: false, + isFolder: false, values: [ { alias: 'maxChars', @@ -53,30 +55,33 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Text Area', id: 'dt-textArea', - parentId: null, + parent: null, editorAlias: 'Umbraco.TextArea', editorUiAlias: 'Umb.PropertyEditorUi.TextArea', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'My JS Property Editor', id: 'dt-custom', - parentId: null, + parent: null, editorAlias: 'Umbraco.Label', editorUiAlias: 'My.PropertyEditorUI.Custom', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Color Picker', id: 'dt-colorPicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.ColorPicker', editorUiAlias: 'Umb.PropertyEditorUi.ColorPicker', + hasChildren: false, + isFolder: false, values: [ { alias: 'useLabel', @@ -126,12 +131,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Content Picker', id: 'dt-contentPicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.ContentPicker', editorUiAlias: 'Umb.PropertyEditorUi.DocumentPicker', + hasChildren: false, + isFolder: false, values: [ { alias: 'validationLimit', @@ -140,12 +146,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Eye Dropper', id: 'dt-eyeDropper', - parentId: null, + parent: null, editorAlias: 'Umbraco.ColorPicker.EyeDropper', editorUiAlias: 'Umb.PropertyEditorUi.EyeDropper', + hasChildren: false, + isFolder: false, values: [ { //showPalette @@ -176,12 +183,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Multi URL Picker', id: 'dt-multiUrlPicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.MultiUrlPicker', editorUiAlias: 'Umb.PropertyEditorUi.MultiUrlPicker', + hasChildren: false, + isFolder: false, values: [ { alias: 'overlaySize', @@ -206,18 +214,28 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Multi Node Tree Picker', id: 'dt-multiNodeTreePicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.MultiNodeTreePicker', editorUiAlias: 'Umb.PropertyEditorUi.TreePicker', + hasChildren: false, + isFolder: false, values: [ { alias: 'startNode', value: { type: 'content', id: null, + dynamicRoot: { + originAlias: 'Root', + querySteps: [ + { + alias: 'FurthestAncestorOrSelf', + anyOfDocTypeKeys: ['all-property-editors-document-type-id'], + }, + ], + }, }, }, { @@ -243,12 +261,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Date Picker', id: 'dt-datePicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.DateTime', editorUiAlias: 'Umb.PropertyEditorUi.DatePicker', + hasChildren: false, + isFolder: false, values: [ { alias: 'format', @@ -265,11 +284,12 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Date Picker With Time', id: 'dt-datePicker-time', - parentId: null, + parent: null, editorAlias: 'Umbraco.DateTime', + hasChildren: false, + isFolder: false, values: [ { alias: 'format', @@ -282,12 +302,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Time', id: 'dt-time', - parentId: null, + parent: null, editorAlias: 'Umbraco.DateTime', editorUiAlias: 'Umb.PropertyEditorUi.DatePicker', + hasChildren: false, + isFolder: false, values: [ { alias: 'format', @@ -300,12 +321,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Email', id: 'dt-email', - parentId: null, + parent: null, editorAlias: 'Umbraco.EmailAddress', editorUiAlias: 'Umb.PropertyEditorUi.Email', + hasChildren: false, + isFolder: false, values: [ { alias: 'inputMode', @@ -314,12 +336,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Multiple Text String', id: 'dt-multipleTextString', - parentId: null, + parent: null, editorAlias: 'Umbraco.MultipleTextString', editorUiAlias: 'Umb.PropertyEditorUi.MultipleTextString', + hasChildren: false, + isFolder: false, values: [ { alias: 'minNumber', @@ -332,12 +355,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Dropdown', id: 'dt-dropdown', - parentId: null, + parent: null, editorAlias: 'Umbraco.DropDown.Flexible', editorUiAlias: 'Umb.PropertyEditorUi.Dropdown', + hasChildren: false, + isFolder: false, values: [ { alias: 'multiple', @@ -354,12 +378,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Slider', id: 'dt-slider', - parentId: null, + parent: null, editorAlias: 'Umbraco.Slider', editorUiAlias: 'Umb.PropertyEditorUi.Slider', + hasChildren: false, + isFolder: false, values: [ { alias: 'enableRange', @@ -388,12 +413,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Toggle', id: 'dt-toggle', - parentId: null, + parent: null, editorAlias: 'Umbraco.TrueFalse', editorUiAlias: 'Umb.PropertyEditorUi.Toggle', + hasChildren: false, + isFolder: false, values: [ { alias: 'default', @@ -414,12 +440,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Tags', id: 'dt-tags', - parentId: null, + parent: null, editorAlias: 'Umbraco.Tags', editorUiAlias: 'Umb.PropertyEditorUi.Tags', + hasChildren: false, + isFolder: false, values: [ { alias: 'group', @@ -432,21 +459,23 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Markdown Editor', id: 'dt-markdownEditor', - parentId: null, + parent: null, editorAlias: 'Umbraco.MarkdownEditor', editorUiAlias: 'Umb.PropertyEditorUi.MarkdownEditor', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Radio Button List', id: 'dt-radioButtonList', - parentId: null, + parent: null, editorAlias: 'Umbraco.RadioButtonList', editorUiAlias: 'Umb.PropertyEditorUi.RadioButtonList', + hasChildren: false, + isFolder: false, values: [ { alias: 'items', @@ -459,12 +488,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Checkbox List', id: 'dt-checkboxList', - parentId: null, + parent: null, editorAlias: 'Umbraco.CheckboxList', editorUiAlias: 'Umb.PropertyEditorUi.CheckboxList', + hasChildren: false, + isFolder: false, values: [ { alias: 'items', @@ -477,12 +507,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Block List', id: 'dt-blockList', - parentId: null, + parent: null, editorAlias: 'Umbraco.BlockList', editorUiAlias: 'Umb.PropertyEditorUi.BlockList', + hasChildren: false, + isFolder: false, values: [ { alias: 'blocks', @@ -490,6 +521,7 @@ export const data: Array = { label: 'Mocked Block Type for Block List', contentElementTypeKey: '4f68ba66-6fb2-4778-83b8-6ab4ca3a7c5c', + settingsElementTypeKey: 'all-property-editors-document-type-id', icon: 'icon-server-alt', }, { @@ -500,7 +532,6 @@ export const data: Array = editorSize: 'medium', icon: 'icon-coffee', }, - { label: 'Headline', contentElementTypeKey: 'headline-umbraco-demo-block-id', @@ -528,24 +559,34 @@ export const data: Array = }, ], }, + { + alias: 'useInlineEditingAsDefault', + value: false, + }, + { + alias: 'useLiveEditing', + value: true, + }, ], }, { - type: 'data-type', name: 'Media Picker', id: 'dt-mediaPicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.MediaPicker3', editorUiAlias: 'Umb.PropertyEditorUi.MediaPicker', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Image Cropper', id: 'dt-imageCropper', - parentId: null, + parent: null, editorAlias: 'Umbraco.ImageCropper', editorUiAlias: 'Umb.PropertyEditorUi.ImageCropper', + hasChildren: false, + isFolder: false, values: [ { alias: 'crops', @@ -570,12 +611,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Upload Field', id: 'dt-uploadField', - parentId: null, + parent: null, editorAlias: 'Umbraco.UploadField', editorUiAlias: 'Umb.PropertyEditorUi.UploadField', + hasChildren: false, + isFolder: false, values: [ { alias: 'fileExtensions', @@ -588,12 +630,13 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Block Grid', id: 'dt-blockGrid', - parentId: null, + parent: null, editorAlias: 'Umbraco.BlockGrid', editorUiAlias: 'Umb.PropertyEditorUi.BlockGrid', + hasChildren: false, + isFolder: false, values: [ { alias: 'blockGroups', @@ -645,35 +688,45 @@ export const data: Array = icon: 'icon-book-alt', groupKey: 'demo-block-group-id', }, + { + label: 'Test broken group key', + contentElementTypeKey: 'test-block-id', + editorSize: 'medium', + icon: 'icon-war', + groupKey: 'group-id-that-does-not-exist', + }, ], }, ], }, { - type: 'data-type', name: 'Collection View', id: 'dt-collectionView', - parentId: null, + parent: null, editorAlias: 'Umbraco.ListView', editorUiAlias: 'Umb.PropertyEditorUi.CollectionView', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Icon Picker', id: 'dt-iconPicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.IconPicker', editorUiAlias: 'Umb.PropertyEditorUi.IconPicker', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Rich Text Editor', id: 'dt-richTextEditor', - parentId: null, + parent: null, editorAlias: 'Umbraco.RichText', editorUiAlias: 'Umb.PropertyEditorUi.TinyMCE', + hasChildren: false, + isFolder: false, values: [ { alias: 'hideLabel', @@ -688,7 +741,7 @@ export const data: Array = '+a[id|style|rel|data-id|data-udi|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-s[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|reversed|start|style|type],-ul[class|style],-li[class|style],br[class],img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align|umbracoorgwidth|umbracoorgheight|onresize|onresizestart|onresizeend|rel|data-id],-sub[style|class],-sup[style|class],-blockquote[dir|style|class],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[class|align|style],-pre[class|align|style],address[class|align|style],-h1[id|dir|class|align|style],-h2[id|dir|class|align|style],-h3[id|dir|class|align|style],-h4[id|dir|class|align|style],-h5[id|dir|class|align|style],-h6[id|style|dir|class|align|style],hr[class|style],small[class|style],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],object[class|id|width|height|codebase|*],param[name|value|_value|class],embed[type|width|height|src|class|*],map[name|class],area[shape|coords|href|alt|target|class],bdo[class],button[class],iframe[*],figure,figcaption,video[*],audio[*],picture[*],source[*],canvas[*]', }, { alias: 'invalidElements', value: 'font' }, - // { alias: 'stylesheets', value: ['/css/rte-content.css'] }, + { alias: 'stylesheets', value: [] }, { alias: 'toolbar', value: [ @@ -710,7 +763,6 @@ export const data: Array = 'anchor', 'table', 'umbmediapicker', - 'umbmacro', 'umbembeddialog', ], }, @@ -746,30 +798,33 @@ export const data: Array = ], }, { - type: 'data-type', name: 'Label', id: 'dt-label', - parentId: null, + parent: null, editorAlias: 'Umbraco.Label', editorUiAlias: 'Umb.PropertyEditorUi.Label', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Integer', id: 'dt-integer', - parentId: null, + parent: null, editorAlias: 'Umbraco.Integer', editorUiAlias: 'Umb.PropertyEditorUi.Integer', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Decimal', id: 'dt-decimal', - parentId: null, + parent: null, editorAlias: 'Umbraco.Decimal', editorUiAlias: 'Umb.PropertyEditorUi.Decimal', + hasChildren: false, + isFolder: false, values: [ { alias: 'step', @@ -778,112 +833,53 @@ export const data: Array = ], }, { - type: 'data-type', name: 'User Picker', id: 'dt-userPicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.UserPicker', editorUiAlias: 'Umb.PropertyEditorUi.UserPicker', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Member Picker', id: 'dt-memberPicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.MemberPicker', editorUiAlias: 'Umb.PropertyEditorUi.MemberPicker', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Member Group Picker', id: 'dt-memberGroupPicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.MemberGroupPicker', editorUiAlias: 'Umb.PropertyEditorUi.MemberGroupPicker', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Data Type in folder', id: 'dt-data-type-in-folder', - parentId: 'dt-folder2', + parent: { id: 'dt-folder2' }, editorAlias: 'Umbraco.MemberGroupPicker', editorUiAlias: 'Umb.PropertyEditorUi.MemberGroupPicker', + hasChildren: false, + isFolder: false, values: [], }, { - type: 'data-type', name: 'Static File Picker', id: 'dt-staticFilePicker', - parentId: null, + parent: null, editorAlias: 'Umbraco.Label', editorUiAlias: 'Umb.PropertyEditorUi.StaticFilePicker', + hasChildren: false, + isFolder: false, values: [], }, ]; - -const createDataTypeItem = (item: DataTypeResponseModel | FolderTreeItemResponseModel): DataTypeItemResponseModel => { - return { - id: item.id, - name: item.name, - }; -}; - -class UmbDataTypeData extends UmbEntityData { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - #tree = new UmbEntityTreeData(this); - - constructor() { - super(data); - } - - getTreeRoot(): Array { - const rootItems = this.data.filter((item) => item.parentId === null); - return rootItems.map((item) => createFolderTreeItem(item)); - } - - getTreeItemChildren(id: string): Array { - const childItems = this.data.filter((item) => item.parentId === id); - return childItems.map((item) => createFolderTreeItem(item)); - } - - getItems(ids: Array): Array { - const items = this.data.filter((item) => ids.includes(item.id ?? '')); - return items.map((item) => createDataTypeItem(item)); - } - - createFolder(folder: CreateFolderRequestModel) { - const newFolder: FolderTreeItemResponseModel = { - type: 'data-type-folder', - name: folder.name, - id: folder.id ? folder.id : UmbId.new(), - parentId: folder.parentId, - isFolder: true, - isContainer: false, - hasChildren: false, - }; - - this.data.push(newFolder); - } - - // TODO: this could be reused across other types that support folders - deleteFolder(id: string) { - const item = this.getById(id) as FolderTreeItemResponseModel; - if (!item) throw new Error(`Item with id ${id} not found`); - if (!item.isFolder) throw new Error(`Item with id ${id} is not a folder`); - this.data = this.data.filter((item) => item.id !== id); - } - - copy(ids: Array, destinationKey: string) { - return this.#tree.copy(ids, destinationKey); - } - - move(ids: Array, destinationKey: string) { - return this.#tree.move(ids, destinationKey); - } -} - -export const umbDataTypeData = new UmbDataTypeData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts new file mode 100644 index 0000000000..95b7562944 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts @@ -0,0 +1,71 @@ +import { UmbEntityMockDbBase } from '../entity/entity-base.js'; +import { UmbMockEntityFolderManager } from '../entity/entity-folder.manager.js'; +import { UmbMockEntityTreeManager } from '../entity/entity-tree.manager.js'; +import { folderTreeItemMapper } from '../utils.js'; +import { UmbMockEntityItemManager } from '../entity/entity-item.manager.js'; +import { UmbMockEntityDetailManager } from '../entity/entity-detail.manager.js'; +import type { UmbMockDataTypeModel} from './data-type.data.js'; +import { data } from './data-type.data.js'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { + CreateDataTypeRequestModel, + CreateFolderRequestModel, + DataTypeItemResponseModel, + DataTypeResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +class UmbDataTypeMockDB extends UmbEntityMockDbBase { + tree = new UmbMockEntityTreeManager(this, folderTreeItemMapper); + folder = new UmbMockEntityFolderManager(this, createMockDataTypeFolderMapper); + item = new UmbMockEntityItemManager(this, dataTypeItemMapper); + detail = new UmbMockEntityDetailManager(this, createMockDataTypeMapper, dataTypeDetailMapper); + + constructor(data: Array) { + super(data); + } +} + +const createMockDataTypeFolderMapper = (request: CreateFolderRequestModel): UmbMockDataTypeModel => { + return { + name: request.name, + id: request.id ? request.id : UmbId.new(), + parentId: request.parentId, + isFolder: true, + hasChildren: false, + editorAlias: '', + values: [], + }; +}; + +const createMockDataTypeMapper = (request: CreateDataTypeRequestModel): UmbMockDataTypeModel => { + return { + id: request.id ? request.id : UmbId.new(), + parentId: request.parentId, + name: request.name, + editorAlias: request.editorAlias, + editorUiAlias: request.editorUiAlias, + values: request.values, + isFolder: false, + hasChildren: false, + }; +}; + +const dataTypeDetailMapper = (item: UmbMockDataTypeModel): DataTypeResponseModel => { + return { + id: item.id, + parentId: item.parentId, + name: item.name, + editorAlias: item.editorAlias, + editorUiAlias: item.editorUiAlias, + values: item.values, + }; +}; + +const dataTypeItemMapper = (item: UmbMockDataTypeModel): DataTypeItemResponseModel => { + return { + id: item.id, + name: item.name, + }; +}; + +export const umbDataTypeMockDb = new UmbDataTypeMockDB(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data.ts index 8f08949ada..d26dc233ff 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data.ts @@ -1,4 +1,3 @@ -// Temp mocked database export class UmbData { protected data: Array = []; @@ -6,6 +5,10 @@ export class UmbData { this.data = data; } + getData() { + return this.data; + } + get total() { return this.data.length; } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/dictionary.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/dictionary.data.ts index 72570e8dcd..0f44a4bdb0 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/dictionary.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/dictionary.data.ts @@ -1,6 +1,9 @@ import { UmbEntityData } from './entity.data.js'; import { createEntityTreeItem } from './utils.js'; -import type { DictionaryItemResponseModel, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { + DictionaryItemResponseModel, + NamedEntityTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; export const data: Array = [ { @@ -33,22 +36,20 @@ export const data: Array = [ }, ]; -const dictionaryTree: Array = [ +const dictionaryTree: Array = [ { - parentId: null, + parent: null, name: 'Hello', id: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', hasChildren: true, type: 'dictionary-item', - isContainer: false, }, { - parentId: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', + parent: null, name: 'Hello again', id: 'bbe7d0ab-53bb-485d-b8bd-12537f9925cb', hasChildren: false, type: 'dictionary-item', - isContainer: false, }, ]; @@ -61,18 +62,18 @@ class UmbDictionaryData extends UmbEntityData { super(data); } - getTreeRoot(): Array { - const rootItems = dictionaryTree.filter((item) => item.parentId === null); + getTreeRoot(): Array { + const rootItems = dictionaryTree.filter((item) => item.parent === null); return rootItems.map((item) => createEntityTreeItem(item)); } - getTreeItemChildren(id: string): Array { - const childItems = dictionaryTree.filter((item) => item.parentId === id); + getTreeItemChildren(id: string): Array { + const childItems = dictionaryTree.filter((item) => item.parent?.id === id); return childItems.map((item) => createEntityTreeItem(item)); } - getTreeItem(ids: Array): Array { - const items = dictionaryTree.filter((item) => ids.includes(item.id ?? '')); + getTreeItem(ids: Array): Array { + const items = dictionaryTree.filter((item) => ids.includes(item.id)); return items.map((item) => createEntityTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.data.ts index 921463a1ca..c03f4b5dd5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.data.ts @@ -1,16 +1,20 @@ -import { - ContentTypeCompositionTypeModel, +import { CompositionTypeModel } from '@umbraco-cms/backoffice/backend-api'; +import type { + DocumentTypeItemResponseModel, DocumentTypeResponseModel, DocumentTypeTreeItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; -export type UmbMockDocumentTypeModel = DocumentTypeResponseModel & DocumentTypeTreeItemResponseModel; +export type UmbMockDocumentTypeModelHack = DocumentTypeResponseModel & + DocumentTypeTreeItemResponseModel & + DocumentTypeItemResponseModel; + +export interface UmbMockDocumentTypeModel extends Omit {} export const data: Array = [ { - type: 'document-type', - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'all-property-editors-document-type-id', alias: 'blogPost', name: 'All property editors document type', @@ -21,17 +25,20 @@ export const data: Array = [ variesBySegment: false, isElement: false, hasChildren: false, - isContainer: false, - parentId: null, + parent: null, isFolder: false, properties: [ { id: '1', - containerId: 'all-properties-group-key', + container: { + id: 'all-properties-group-key', + }, alias: 'richTextEditor', name: 'Rich Text editor', description: 'Some description to test with a long description.', - dataTypeId: 'dt-richTextEditor', + dataType: { + id: 'dt-richTextEditor', + }, variesByCulture: false, variesBySegment: false, sortOrder: 0, @@ -47,11 +54,15 @@ export const data: Array = [ }, { id: '2', - containerId: 'all-properties-group-id', + container: { + id: 'all-properties-group-key', + }, alias: 'colorPicker', name: 'Color Picker', description: '', - dataTypeId: 'dt-colorPicker', + dataType: { + id: 'dt-colorPicker', + }, variesByCulture: false, variesBySegment: false, sortOrder: 1, @@ -67,11 +78,15 @@ export const data: Array = [ }, { id: '3', - containerId: 'all-properties-group-key', + container: { + id: 'all-properties-group-key', + }, alias: 'contentPicker', name: 'Content Picker', description: '', - dataTypeId: 'dt-contentPicker', + dataType: { + id: 'dt-contentPicker', + }, variesByCulture: false, variesBySegment: false, sortOrder: 2, @@ -87,11 +102,11 @@ export const data: Array = [ }, { id: '4', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'eyeDropper', name: 'Eye Dropper', description: '', - dataTypeId: 'dt-eyeDropper', + dataType: { id: 'dt-eyeDropper' }, variesByCulture: false, variesBySegment: false, sortOrder: 3, @@ -107,11 +122,11 @@ export const data: Array = [ }, { id: '5', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'multiUrlPicker', name: 'Multi URL Picker', description: '', - dataTypeId: 'dt-multiUrlPicker', + dataType: { id: 'dt-multiUrlPicker' }, variesByCulture: true, variesBySegment: false, sortOrder: 4, @@ -127,11 +142,11 @@ export const data: Array = [ }, { id: '6', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'multiNodeTreePicker', name: 'Multi Node Tree Picker', description: '', - dataTypeId: 'dt-multiNodeTreePicker', + dataType: { id: 'dt-multiNodeTreePicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 5, @@ -147,11 +162,11 @@ export const data: Array = [ }, { id: '7', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'datePicker', name: 'Date Picker', description: '', - dataTypeId: 'dt-datePicker', + dataType: { id: 'dt-datePicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 6, @@ -167,11 +182,11 @@ export const data: Array = [ }, { id: '7b', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'datePicker-b', name: 'Date Picker With Time', description: '', - dataTypeId: 'dt-datePicker-time', + dataType: { id: 'dt-datePicker-time' }, variesByCulture: false, variesBySegment: false, sortOrder: 7, @@ -187,11 +202,11 @@ export const data: Array = [ }, { id: '8', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'email', name: 'Email', description: '', - dataTypeId: 'dt-email', + dataType: { id: 'dt-email' }, variesByCulture: false, variesBySegment: false, sortOrder: 9, @@ -207,11 +222,11 @@ export const data: Array = [ }, { id: '9', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'textBox', name: 'Text Box', description: '', - dataTypeId: 'dt-textBox', + dataType: { id: 'dt-textBox' }, variesByCulture: false, variesBySegment: false, sortOrder: 10, @@ -227,11 +242,11 @@ export const data: Array = [ }, { id: '19', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'dropdown', name: 'Dropdown', description: '', - dataTypeId: 'dt-dropdown', + dataType: { id: 'dt-dropdown' }, variesByCulture: false, variesBySegment: false, sortOrder: 11, @@ -247,11 +262,11 @@ export const data: Array = [ }, { id: '11', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'textArea', name: 'Text Area', description: '', - dataTypeId: 'dt-textArea', + dataType: { id: 'dt-textArea' }, variesByCulture: false, variesBySegment: false, sortOrder: 12, @@ -267,11 +282,11 @@ export const data: Array = [ }, { id: '12', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'slider', name: 'Slider', description: '', - dataTypeId: 'dt-slider', + dataType: { id: 'dt-slider' }, variesByCulture: false, variesBySegment: false, sortOrder: 13, @@ -287,11 +302,11 @@ export const data: Array = [ }, { id: '13', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'toggle', name: 'Toggle', description: '', - dataTypeId: 'dt-toggle', + dataType: { id: 'dt-toggle' }, variesByCulture: false, variesBySegment: false, sortOrder: 14, @@ -307,11 +322,11 @@ export const data: Array = [ }, { id: '14', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'tags', name: 'Tags', description: '', - dataTypeId: 'dt-tags', + dataType: { id: 'dt-tags' }, variesByCulture: false, variesBySegment: false, sortOrder: 15, @@ -327,11 +342,11 @@ export const data: Array = [ }, { id: '15', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'markdownEditor', name: 'MarkdownEditor', description: '', - dataTypeId: 'dt-markdownEditor', + dataType: { id: 'dt-markdownEditor' }, variesByCulture: false, variesBySegment: false, sortOrder: 16, @@ -347,11 +362,11 @@ export const data: Array = [ }, { id: '16', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'radioButtonList', name: 'Radio Button List', description: '', - dataTypeId: 'dt-radioButtonList', + dataType: { id: 'dt-radioButtonList' }, variesByCulture: false, variesBySegment: false, sortOrder: 17, @@ -367,11 +382,11 @@ export const data: Array = [ }, { id: '17', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'checkboxList', name: 'Checkbox List', description: '', - dataTypeId: 'dt-checkboxList', + dataType: { id: 'dt-checkboxList' }, variesByCulture: false, variesBySegment: false, sortOrder: 18, @@ -387,11 +402,11 @@ export const data: Array = [ }, { id: '18', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'blockList', name: 'Block List', description: '', - dataTypeId: 'dt-blockList', + dataType: { id: 'dt-blockList' }, variesByCulture: false, variesBySegment: false, sortOrder: -2, @@ -407,11 +422,11 @@ export const data: Array = [ }, { id: '19', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'mediaPicker', name: 'Media Picker', description: '', - dataTypeId: 'dt-mediaPicker', + dataType: { id: 'dt-mediaPicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 20, @@ -427,11 +442,11 @@ export const data: Array = [ }, { id: '20', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'imageCropper', name: 'Image Cropper', description: '', - dataTypeId: 'dt-imageCropper', + dataType: { id: 'dt-imageCropper' }, variesByCulture: false, variesBySegment: false, sortOrder: 21, @@ -447,11 +462,11 @@ export const data: Array = [ }, { id: '21', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'uploadField', name: 'Upload Field', description: '', - dataTypeId: 'dt-uploadField', + dataType: { id: 'dt-uploadField' }, variesByCulture: false, variesBySegment: false, sortOrder: 22, @@ -467,11 +482,11 @@ export const data: Array = [ }, { id: '22', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'blockGrid', name: 'Block Grid', description: '', - dataTypeId: 'dt-blockGrid', + dataType: { id: 'dt-blockGrid' }, variesByCulture: false, variesBySegment: false, sortOrder: -1, @@ -487,11 +502,11 @@ export const data: Array = [ }, { id: '23', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'iconPicker', name: 'Icon Picker', description: '', - dataTypeId: 'dt-iconPicker', + dataType: { id: 'dt-iconPicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 24, @@ -507,11 +522,11 @@ export const data: Array = [ }, { id: '27', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'label', name: 'Label', description: '', - dataTypeId: 'dt-label', + dataType: { id: 'dt-label' }, variesByCulture: false, variesBySegment: false, sortOrder: 25, @@ -527,11 +542,11 @@ export const data: Array = [ }, { id: '28', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'integer', name: 'Integer', description: '', - dataTypeId: 'dt-integer', + dataType: { id: 'dt-integer' }, variesByCulture: false, variesBySegment: false, sortOrder: 26, @@ -547,11 +562,11 @@ export const data: Array = [ }, { id: '29', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'decimal', name: 'Decimal', description: '', - dataTypeId: 'dt-decimal', + dataType: { id: 'dt-decimal' }, variesByCulture: false, variesBySegment: false, sortOrder: 27, @@ -567,11 +582,11 @@ export const data: Array = [ }, { id: '30', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'memberPicker', name: 'Member Picker', description: '', - dataTypeId: 'dt-memberPicker', + dataType: { id: 'dt-memberPicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 29, @@ -587,11 +602,11 @@ export const data: Array = [ }, { id: '31', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'memberGroupPicker', name: 'Member Group Picker', description: '', - dataTypeId: 'dt-memberGroupPicker', + dataType: { id: 'dt-memberGroupPicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 30, @@ -607,11 +622,11 @@ export const data: Array = [ }, { id: '32', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'userPicker', name: 'User Picker', description: '', - dataTypeId: 'dt-userPicker', + dataType: { id: 'dt-userPicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 31, @@ -627,11 +642,11 @@ export const data: Array = [ }, { id: '33', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'staticFilePicker', name: 'Static File Picker', description: '', - dataTypeId: 'dt-staticFilePicker', + dataType: { id: 'dt-staticFilePicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 32, @@ -649,13 +664,13 @@ export const data: Array = [ containers: [ { id: 'all-properties-group-key', - parentId: null, + parent: null, name: 'Content', type: 'Group', sortOrder: 0, }, ], - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -664,8 +679,8 @@ export const data: Array = [ }, }, { - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'simple-document-type-id', alias: 'blogPost', name: 'All property editors document type', @@ -675,19 +690,17 @@ export const data: Array = [ variesByCulture: true, variesBySegment: false, isElement: false, - type: 'document-type', hasChildren: false, - isContainer: false, - parentId: null, + parent: null, isFolder: false, properties: [ { id: '6', - containerId: 'all-properties-group-key', + container: { id: 'all-properties-group-key' }, alias: 'multiNodeTreePicker', name: 'Multi Node Tree Picker', description: '', - dataTypeId: 'dt-multiNodeTreePicker', + dataType: { id: 'dt-multiNodeTreePicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 0, @@ -705,13 +718,13 @@ export const data: Array = [ containers: [ { id: 'all-properties-group-key', - parentId: null, + parent: null, name: 'Content', type: 'Group', sortOrder: 0, }, ], - allowedContentTypes: [], + allowedDocumentTypes: [{ documentType: { id: 'simple-document-type-id' }, sortOrder: 0 }], compositions: [], cleanup: { preventCleanup: false, @@ -721,8 +734,8 @@ export const data: Array = [ }, { - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: '29643452-cff9-47f2-98cd-7de4b6807681', alias: 'blogPost', name: 'Page Document Type', @@ -732,19 +745,17 @@ export const data: Array = [ variesByCulture: true, variesBySegment: false, isElement: false, - type: 'document-type', hasChildren: false, - isContainer: false, - parentId: null, + parent: null, isFolder: false, properties: [ { id: '5b4ca208-134e-4865-b423-06e5e97adf3c', - containerId: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', + container: { id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75' }, alias: 'blogPostText', name: 'Blog Post Text', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: false, variesBySegment: false, sortOrder: 0, @@ -760,11 +771,11 @@ export const data: Array = [ }, { id: 'ef7096b6-7c9e-49ba-8d49-395111e65ea2', - containerId: '227d6ed2-e118-4494-b8f2-deb69854a56a', + container: { id: '227d6ed2-e118-4494-b8f2-deb69854a56a' }, alias: 'blogTextStringUnderMasterTab', name: 'Blog text string under master tab', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: true, variesBySegment: false, sortOrder: 1, @@ -780,11 +791,11 @@ export const data: Array = [ }, { id: 'e010c429-b298-499a-9bfe-79687af8972a', - containerId: '22177c49-ecba-4f2e-b7fa-3f2c04d02cfb', + container: { id: '22177c49-ecba-4f2e-b7fa-3f2c04d02cfb' }, alias: 'blogTextStringUnderGroupUnderMasterTab', name: 'Blog text string under group under master tab', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: true, variesBySegment: false, sortOrder: 2, @@ -800,11 +811,11 @@ export const data: Array = [ }, { id: '1a22749a-c7d2-44bb-b36b-c977c2ced6ef', - containerId: '2c943997-b685-432d-a6c5-601d8e7a298a', + container: { id: '2c943997-b685-432d-a6c5-601d8e7a298a' }, alias: 'localBlogTabString', name: 'Local Blog Tab String', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: false, variesBySegment: false, sortOrder: 3, @@ -820,11 +831,11 @@ export const data: Array = [ }, { id: '22', - containerId: '2c943997-b685-432d-a6c5-601d8e7a298a', + container: { id: '2c943997-b685-432d-a6c5-601d8e7a298a' }, alias: 'blockGrid', name: 'Block Grid', description: '', - dataTypeId: 'dt-blockGrid', + dataType: { id: 'dt-blockGrid' }, variesByCulture: false, variesBySegment: false, sortOrder: 4, @@ -842,47 +853,47 @@ export const data: Array = [ containers: [ { id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', - parentId: null, + parent: null, name: 'Content-group', type: 'Group', sortOrder: 0, }, { id: '227d6ed2-e118-4494-b8f2-deb69854a56a', - parentId: null, + parent: null, name: 'Master Tab', type: 'Tab', sortOrder: 0, }, { id: '22177c49-ecba-4f2e-b7fa-3f2c04d02cfb', - parentId: '227d6ed2-e118-4494-b8f2-deb69854a56a', + parent: { id: '227d6ed2-e118-4494-b8f2-deb69854a56a' }, name: 'Blog Group under master tab', type: 'Group', sortOrder: 0, }, { id: '2c943997-b685-432d-a6c5-601d8e7a298a', - parentId: null, + parent: null, name: 'Local blog tab', type: 'Tab', sortOrder: 1, }, ], - allowedContentTypes: [ + allowedDocumentTypes: [ { - id: '29643452-cff9-47f2-98cd-7de4b6807681', + documentType: { id: '29643452-cff9-47f2-98cd-7de4b6807681' }, sortOrder: 0, }, ], compositions: [ { - id: '8f68ba66-6fb2-4778-83b8-6ab4ca3a7c5d', - compositionType: ContentTypeCompositionTypeModel.INHERITANCE, + documentType: { id: '8f68ba66-6fb2-4778-83b8-6ab4ca3a7c5d' }, + compositionType: CompositionTypeModel.INHERITANCE, }, { - id: '5035d7d9-0a63-415c-9e75-ee2cf931db92', - compositionType: ContentTypeCompositionTypeModel.COMPOSITION, + documentType: { id: '5035d7d9-0a63-415c-9e75-ee2cf931db92' }, + compositionType: CompositionTypeModel.COMPOSITION, }, ], cleanup: { @@ -892,8 +903,10 @@ export const data: Array = [ }, }, { - allowedTemplateIds: ['916cfecc-3295-490c-a16d-c41fa9f72980'], - defaultTemplateId: '916cfecc-3295-490c-a16d-c41fa9f72980', + allowedTemplates: [{ id: '916cfecc-3295-490c-a16d-c41fa9f72980' }], + defaultTemplate: { + id: '916cfecc-3295-490c-a16d-c41fa9f72980', + }, id: '5035d7d9-0a63-415c-9e75-ee2cf931db92', alias: 'masterPage', name: 'Master Page', @@ -903,19 +916,17 @@ export const data: Array = [ variesByCulture: false, variesBySegment: false, isElement: false, - type: 'document-type', hasChildren: false, - isContainer: false, - parentId: null, + parent: null, isFolder: false, properties: [ { id: '5e5f7456-c751-4846-9f2b-47965cc96ec6', - containerId: '6f281e5a-0242-4649-bd9e-d6bf87f92b41', + container: { id: '6f281e5a-0242-4649-bd9e-d6bf87f92b41' }, alias: 'masterText', name: 'Master text', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: false, variesBySegment: false, sortOrder: 0, @@ -933,13 +944,13 @@ export const data: Array = [ containers: [ { id: '6f281e5a-0242-4649-bd9e-d6bf87f92b41', - parentId: null, + parent: null, name: 'Master Tab', type: 'Tab', sortOrder: 0, }, ], - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -948,8 +959,8 @@ export const data: Array = [ }, }, { - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: '8f68ba66-6fb2-4778-83b8-6ab4ca3a7c5d', alias: 'baseElementType', name: 'Base Element Type', @@ -959,19 +970,17 @@ export const data: Array = [ variesByCulture: false, variesBySegment: false, isElement: true, - type: 'document-type', hasChildren: false, - isContainer: false, - parentId: null, + parent: null, isFolder: false, properties: [ { id: 'b92de6ac-1a22-4a45-a481-b6cae1cccbbf', - containerId: '1e845ca8-1e3e-4b03-be1d-0b4149ce2129', + container: { id: '1e845ca8-1e3e-4b03-be1d-0b4149ce2129' }, alias: 'pageTitle', name: 'Page title', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: false, variesBySegment: false, sortOrder: 0, @@ -989,13 +998,13 @@ export const data: Array = [ containers: [ { id: '1e845ca8-1e3e-4b03-be1d-0b4149ce2129', - parentId: null, + parent: null, name: 'Content-group', type: 'Group', sortOrder: 0, }, ], - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -1004,8 +1013,8 @@ export const data: Array = [ }, }, { - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: '4f68ba66-6fb2-4778-83b8-6ab4ca3a7c5c', alias: 'simpleElementType', name: 'Simple Element Type', @@ -1015,19 +1024,17 @@ export const data: Array = [ variesByCulture: false, variesBySegment: false, isElement: true, - type: 'document-type', hasChildren: false, - isContainer: false, - parentId: null, + parent: null, isFolder: false, properties: [ { id: 'b92de6ac-1a22-4a45-a481-b6cae1cccbb0', - containerId: '1e845ca8-1e3e-4b03-be1d-0b4149ce2120', + container: { id: '1e845ca8-1e3e-4b03-be1d-0b4149ce2120' }, alias: 'elementProperty', name: 'Element property', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: false, variesBySegment: false, sortOrder: 0, @@ -1045,13 +1052,13 @@ export const data: Array = [ containers: [ { id: '1e845ca8-1e3e-4b03-be1d-0b4149ce2120', - parentId: null, + parent: null, name: 'Content-group', type: 'Group', sortOrder: 0, }, ], - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -1060,12 +1067,18 @@ export const data: Array = [ }, }, { - allowedTemplateIds: [ - '2bf464b6-3aca-4388-b043-4eb439cc2643', - '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', - '9a84c0b3-03b4-4dd4-84ac-706740ac0f72', + allowedTemplates: [ + { + id: '2bf464b6-3aca-4388-b043-4eb439cc2643', + }, + { + id: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', + }, + { + id: '9a84c0b3-03b4-4dd4-84ac-706740ac0f72', + }, ], - defaultTemplateId: '2bf464b6-3aca-4388-b043-4eb439cc2643', + defaultTemplate: { id: '2bf464b6-3aca-4388-b043-4eb439cc2643' }, id: 'simple-document-type-key', alias: 'simpleDocumentType', name: 'Simple Document Type', @@ -1075,19 +1088,17 @@ export const data: Array = [ variesByCulture: false, variesBySegment: false, isElement: false, - type: 'document-type', hasChildren: false, - isContainer: false, - parentId: null, + parent: null, isFolder: false, properties: [ { id: '1680d4d2-cda8-4ac2-affd-a69fc10382b1', - containerId: '341b8521-fd43-4333-ae7a-a10cbbc6f4b0', + container: { id: '341b8521-fd43-4333-ae7a-a10cbbc6f4b0' }, alias: 'prop1', name: 'Prop 1', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: false, variesBySegment: false, sortOrder: 0, @@ -1105,15 +1116,15 @@ export const data: Array = [ containers: [ { id: '341b8521-fd43-4333-ae7a-a10cbbc6f4b0', - parentId: null, + parent: null, name: 'Content', type: 'Group', sortOrder: 0, }, ], - allowedContentTypes: [ - { id: 'simple-document-type-key', sortOrder: 0 }, - { id: 'simple-document-type-2-key', sortOrder: 0 }, + allowedDocumentTypes: [ + { documentType: { id: 'simple-document-type-key' }, sortOrder: 0 }, + { documentType: { id: 'simple-document-type-2-key' }, sortOrder: 0 }, ], compositions: [], cleanup: { @@ -1123,8 +1134,8 @@ export const data: Array = [ }, }, { - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'simple-document-type-2-key', alias: 'simpleDocumentType2', name: 'Simple Document Type 2', @@ -1134,19 +1145,17 @@ export const data: Array = [ variesByCulture: false, variesBySegment: false, isElement: false, - type: 'document-type', hasChildren: false, - isContainer: false, - parentId: null, + parent: null, isFolder: false, properties: [ { id: '82d4b050-b128-42fe-ac8e-d5586e533592', - containerId: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', + container: { id: 'b275052a-1868-4901-bc8c-2b35b78a9ab2' }, alias: 'prop1', name: 'Prop 1', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: false, variesBySegment: false, sortOrder: 0, @@ -1162,11 +1171,11 @@ export const data: Array = [ }, { id: 'beadc69a-d669-4d01-9919-98bafba31e57', - containerId: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', + container: { id: 'b275052a-1868-4901-bc8c-2b35b78a9ab2' }, alias: 'prop2', name: 'Prop 2', description: null, - dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataType: { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae' }, variesByCulture: false, variesBySegment: false, sortOrder: 1, @@ -1184,13 +1193,13 @@ export const data: Array = [ containers: [ { id: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', - parentId: null, + parent: null, name: 'Content', type: 'Group', sortOrder: 0, }, ], - allowedContentTypes: [{ id: 'simple-document-type-key', sortOrder: 0 }], + allowedDocumentTypes: [{ documentType: { id: 'simple-document-type-key' }, sortOrder: 0 }], compositions: [], cleanup: { preventCleanup: false, @@ -1199,9 +1208,8 @@ export const data: Array = [ }, }, { - type: 'document-type', - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'folder-umbraco-demo-blocks-id', alias: 'folderUmbracoDemoBlocks', name: 'Umbraco Demo Blocks', @@ -1212,10 +1220,9 @@ export const data: Array = [ variesBySegment: false, isElement: false, hasChildren: true, - isContainer: false, - parentId: null, + parent: null, isFolder: true, - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -1226,9 +1233,8 @@ export const data: Array = [ containers: [], }, { - type: 'document-type', - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'coffee-umbraco-demo-block-id', alias: 'coffeeUmbracoDemoBlock', name: 'Favorite Coffee', @@ -1239,10 +1245,9 @@ export const data: Array = [ variesBySegment: false, isElement: true, hasChildren: false, - isContainer: false, - parentId: 'folder-umbraco-demo-blocks-id', + parent: { id: 'folder-umbraco-demo-blocks-id' }, isFolder: false, - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -1252,11 +1257,11 @@ export const data: Array = [ properties: [ { id: 'coffee-name-id', - containerId: 'coffee-content-group-key', + container: { id: 'coffee-content-group-key' }, alias: 'coffeeName', name: 'Name of Coffee', description: '', - dataTypeId: 'dt-textBox', + dataType: { id: 'dt-textBox' }, variesByCulture: false, variesBySegment: false, sortOrder: 10, @@ -1272,11 +1277,11 @@ export const data: Array = [ }, { id: 'coffee-size-id', - containerId: 'coffee-content-group-key', + container: { id: 'coffee-content-group-key' }, alias: 'coffeeSize', name: 'Amount (deciliter)', description: '', - dataTypeId: 'dt-integer', + dataType: { id: 'dt-integer' }, variesByCulture: false, variesBySegment: false, sortOrder: 10, @@ -1294,7 +1299,7 @@ export const data: Array = [ containers: [ { id: 'coffee-content-group-key', - parentId: null, + parent: null, name: 'Content', type: 'Group', sortOrder: 0, @@ -1302,9 +1307,8 @@ export const data: Array = [ ], }, { - type: 'document-type', - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'headline-umbraco-demo-block-id', alias: 'headlineUmbracoDemoBlock', name: 'Headline', @@ -1315,10 +1319,9 @@ export const data: Array = [ variesBySegment: false, isElement: true, hasChildren: false, - isContainer: false, - parentId: 'folder-umbraco-demo-blocks-id', + parent: { id: 'folder-umbraco-demo-blocks-id' }, isFolder: false, - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -1328,11 +1331,11 @@ export const data: Array = [ properties: [ { id: 'headline-id', - containerId: 'headline-content-group-key', + container: { id: 'headline-content-group-key' }, alias: 'headline', name: 'Headline', description: '', - dataTypeId: 'dt-textBox', + dataType: { id: 'dt-textBox' }, variesByCulture: false, variesBySegment: false, sortOrder: 10, @@ -1350,7 +1353,7 @@ export const data: Array = [ containers: [ { id: 'headline-content-group-key', - parentId: null, + parent: null, name: 'Content', type: 'Group', sortOrder: 0, @@ -1358,9 +1361,8 @@ export const data: Array = [ ], }, { - type: 'document-type', - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'image-umbraco-demo-block-id', alias: 'imageUmbracoDemoBlock', name: 'Image', @@ -1371,10 +1373,9 @@ export const data: Array = [ variesBySegment: false, isElement: true, hasChildren: false, - isContainer: false, - parentId: 'folder-umbraco-demo-blocks-id', + parent: { id: 'folder-umbraco-demo-blocks-id' }, isFolder: false, - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -1384,11 +1385,11 @@ export const data: Array = [ properties: [ { id: 'image-id', - containerId: 'image-content-group-key', + container: { id: 'image-content-group-key' }, alias: 'image', name: 'Image', description: '', - dataTypeId: 'dt-mediaPicker', + dataType: { id: 'dt-mediaPicker' }, variesByCulture: false, variesBySegment: false, sortOrder: 10, @@ -1406,7 +1407,7 @@ export const data: Array = [ containers: [ { id: 'image-content-group-key', - parentId: null, + parent: null, name: 'Content', type: 'Group', sortOrder: 0, @@ -1414,9 +1415,8 @@ export const data: Array = [ ], }, { - type: 'document-type', - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'rich-text-umbraco-demo-block-id', alias: 'richTextUmbracoDemoBlock', name: 'Rich Text', @@ -1427,10 +1427,9 @@ export const data: Array = [ variesBySegment: false, isElement: true, hasChildren: false, - isContainer: false, - parentId: 'folder-umbraco-demo-blocks-id', + parent: { id: 'folder-umbraco-demo-blocks-id' }, isFolder: false, - allowedContentTypes: [], + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, @@ -1440,11 +1439,11 @@ export const data: Array = [ properties: [ { id: 'rich-text-id', - containerId: 'rich-text-content-group-key', + container: { id: 'rich-text-content-group-key' }, alias: 'richText', name: 'Text', description: '', - dataTypeId: 'dt-richTextEditor', + dataType: { id: 'dt-richTextEditor' }, variesByCulture: false, variesBySegment: false, sortOrder: 10, @@ -1462,7 +1461,7 @@ export const data: Array = [ containers: [ { id: 'rich-text-content-group-key', - parentId: null, + parent: null, name: 'Content', type: 'Group', sortOrder: 0, @@ -1470,9 +1469,8 @@ export const data: Array = [ ], }, { - type: 'document-type', - allowedTemplateIds: [], - defaultTemplateId: null, + allowedTemplates: [], + defaultTemplate: null, id: 'two-column-layout-umbraco-demo-block-id', alias: 'twoColumnLayoutUmbracoDemoBlock', name: 'Two Column Layout', @@ -1483,10 +1481,36 @@ export const data: Array = [ variesBySegment: false, isElement: true, hasChildren: false, - isContainer: false, - parentId: 'folder-umbraco-demo-blocks-id', + parent: { + id: 'folder-umbraco-demo-blocks-id', + }, isFolder: false, - allowedContentTypes: [], + allowedDocumentTypes: [], + compositions: [], + cleanup: { + preventCleanup: false, + keepAllVersionsNewerThanDays: null, + keepLatestVersionPerDayForDays: null, + }, + properties: [], + containers: [], + }, + { + allowedTemplates: [], + defaultTemplate: null, + id: 'test-block-id', + alias: 'testBlock', + name: 'Test broken group key', + description: null, + icon: 'icon-war', + allowedAsRoot: true, + variesByCulture: false, + variesBySegment: false, + isElement: true, + hasChildren: false, + parent: null, + isFolder: false, + allowedDocumentTypes: [], compositions: [], cleanup: { preventCleanup: false, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.db.ts index fa8540ac84..2a8d456990 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-type/document-type.db.ts @@ -1,81 +1,156 @@ -import { UmbEntityData } from '../entity.data.js'; -import { createEntityTreeItem } from '../utils.js'; -import { UmbMockDocumentTypeModel, data } from './document-type.data.js'; -import { - DocumentTypeTreeItemResponseModel, - DocumentTypeResponseModel, +import { UmbEntityMockDbBase } from '../entity/entity-base.js'; +import { UmbMockEntityFolderManager } from '../entity/entity-folder.manager.js'; +import { UmbMockEntityTreeManager } from '../entity/entity-tree.manager.js'; +import { UmbMockEntityItemManager } from '../entity/entity-item.manager.js'; +import { UmbMockEntityDetailManager } from '../entity/entity-detail.manager.js'; +import type { UmbMockDocumentTypeModel } from './document-type.data.js'; +import { data } from './document-type.data.js'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { + AllowedDocumentTypeModel, + CreateDocumentTypeRequestModel, + CreateFolderRequestModel, DocumentTypeItemResponseModel, + DocumentTypeResponseModel, + DocumentTypeSortModel, + DocumentTypeTreeItemResponseModel, + PagedAllowedDocumentTypeModel, } from '@umbraco-cms/backoffice/backend-api'; -class UmbDocumentTypeData extends UmbEntityData { - constructor() { +class UmbDocumentTypeMockDB extends UmbEntityMockDbBase { + tree = new UmbMockEntityTreeManager(this, documentTypeTreeItemMapper); + folder = new UmbMockEntityFolderManager(this, createMockDocumentTypeFolderMapper); + item = new UmbMockEntityItemManager(this, documentTypeItemMapper); + detail = new UmbMockEntityDetailManager( + this, + createMockDocumentTypeMapper, + documentTypeDetailMapper, + ); + + constructor(data: Array) { super(data); } - // TODO: Can we do this smarter so we don't need to make this for each mock data: - insert(item: DocumentTypeResponseModel) { - const mockItem: UmbMockDocumentTypeModel = { - ...item, - type: 'document-type', - isContainer: false, - hasChildren: false, - isFolder: false, - }; - - super.insert(mockItem); + getAllowedChildren(id: string): PagedAllowedDocumentTypeModel { + const documentType = this.detail.read(id); + const allowedDocumentTypes = documentType.allowedDocumentTypes.map((sortModel: DocumentTypeSortModel) => + this.detail.read(sortModel.documentType.id), + ); + const mappedItems = allowedDocumentTypes.map((item: UmbMockDocumentTypeModel) => allowedDocumentTypeMapper(item)); + return { items: mappedItems, total: mappedItems.length }; } - update(id: string, item: DocumentTypeResponseModel) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - super.save(id, item); - } - - getTreeRoot(): Array { - const rootItems = this.data.filter((item) => item.parentId === null); - return rootItems.map((item) => createDocumentTypeTreeItem(item)); - } - - getTreeItemChildren(id: string): Array { - const childItems = this.data.filter((item) => item.parentId === id); - return childItems.map((item) => createDocumentTypeTreeItem(item)); - } - - getTreeItem(ids: Array): Array { - const items = this.data.filter((item) => ids.includes(item.id ?? '')); - return items.map((item) => createDocumentTypeTreeItem(item)); - } - - getAllowedTypesOf(id: string): Array { - const documentType = this.getById(id); - const allowedTypeKeys = documentType?.allowedContentTypes?.map((documentType) => documentType.id) ?? []; - const items = this.data.filter((item) => allowedTypeKeys.includes(item.id ?? '')); - return items.map((item) => createDocumentTypeTreeItem(item)); - } - - getItems(ids: Array): Array { - const items = this.data.filter((item) => ids.includes(item.id ?? '')); - return items.map((item) => createDocumentTypeItem(item)); + getAllowedAtRoot(): PagedAllowedDocumentTypeModel { + const mockItems = this.data.filter((item) => item.allowedAsRoot); + const mappedItems = mockItems.map((item) => allowedDocumentTypeMapper(item)); + return { items: mappedItems, total: mappedItems.length }; } } -export const createDocumentTypeTreeItem = (item: DocumentTypeResponseModel): DocumentTypeTreeItemResponseModel => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore +const createMockDocumentTypeFolderMapper = (request: CreateFolderRequestModel): UmbMockDocumentTypeModel => { return { - ...createEntityTreeItem(item), - type: 'document-type', + name: request.name, + id: request.id ? request.id : UmbId.new(), + parent: request.parentId ? { id: request.parentId } : null, + description: '', + alias: '', + icon: '', + properties: [], + containers: [], + allowedAsRoot: false, + variesByCulture: false, + variesBySegment: false, + isElement: false, + allowedDocumentTypes: [], + compositions: [], + isFolder: true, + hasChildren: false, + allowedTemplates: [], + cleanup: { + preventCleanup: false, + keepAllVersionsNewerThanDays: null, + keepLatestVersionPerDayForDays: null, + }, + }; +}; + +const createMockDocumentTypeMapper = (request: CreateDocumentTypeRequestModel): UmbMockDocumentTypeModel => { + return { + name: request.name, + id: request.id ? request.id : UmbId.new(), + description: request.description, + alias: request.alias, + icon: request.icon, + properties: request.properties, + containers: request.containers, + allowedAsRoot: request.allowedAsRoot, + variesByCulture: request.variesByCulture, + variesBySegment: request.variesBySegment, + isElement: request.isElement, + allowedDocumentTypes: request.allowedDocumentTypes, + compositions: request.compositions, + parent: request.folder, + isFolder: false, + hasChildren: false, + allowedTemplates: [], + cleanup: { + preventCleanup: false, + keepAllVersionsNewerThanDays: null, + keepLatestVersionPerDayForDays: null, + }, + }; +}; + +const documentTypeDetailMapper = (item: UmbMockDocumentTypeModel): DocumentTypeResponseModel => { + return { + name: item.name, + id: item.id, + description: item.description, + alias: item.alias, + icon: item.icon, + properties: item.properties, + containers: item.containers, + allowedAsRoot: item.allowedAsRoot, + variesByCulture: item.variesByCulture, + variesBySegment: item.variesBySegment, + isElement: item.isElement, + allowedDocumentTypes: item.allowedDocumentTypes, + compositions: item.compositions, + allowedTemplates: item.allowedTemplates, + cleanup: item.cleanup, + }; +}; + +const documentTypeTreeItemMapper = ( + item: UmbMockDocumentTypeModel, +): Omit => { + return { + name: item.name, + hasChildren: item.hasChildren, + id: item.id, + parent: item.parent, + isFolder: item.isFolder, + icon: item.icon, isElement: item.isElement, }; }; -const createDocumentTypeItem = (item: DocumentTypeResponseModel): DocumentTypeItemResponseModel => { +const documentTypeItemMapper = (item: UmbMockDocumentTypeModel): DocumentTypeItemResponseModel => { return { id: item.id, name: item.name, + icon: item.icon, isElement: item.isElement, + }; +}; + +const allowedDocumentTypeMapper = (item: UmbMockDocumentTypeModel): AllowedDocumentTypeModel => { + return { + id: item.id, + name: item.name, + description: item.description, icon: item.icon, }; }; -export const umbDocumentTypeData = new UmbDocumentTypeData(); +export const umbDocumentTypeMockDb = new UmbDocumentTypeMockDB(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document-publishing.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document-publishing.manager.ts new file mode 100644 index 0000000000..52af46c503 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document-publishing.manager.ts @@ -0,0 +1,40 @@ +import type { UmbMockDocumentModel } from './document.data.js'; +import type { UmbDocumentMockDB } from './document.db.js'; +import type { PublishDocumentRequestModel, UnpublishDocumentRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { ContentStateModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockDocumentPublishingManager { + #documentDb: UmbDocumentMockDB; + + constructor(documentDb: UmbDocumentMockDB) { + this.#documentDb = documentDb; + } + + publish(id: string, data: PublishDocumentRequestModel) { + const document: UmbMockDocumentModel = this.#documentDb.detail.read(id); + + document?.variants?.forEach((variant) => { + const hasCulture = variant.culture && data.cultures?.includes(variant.culture); + + if (hasCulture) { + variant.state = ContentStateModel.PUBLISHED; + } + }); + + this.#documentDb.detail.update(id, document); + } + + unpublish(id: string, data: UnpublishDocumentRequestModel) { + const document: UmbMockDocumentModel = this.#documentDb.detail.read(id); + + document?.variants?.forEach((variant) => { + const hasCulture = variant.culture && data.culture === variant.culture; + + if (hasCulture) { + variant.state = ContentStateModel.DRAFT; + } + }); + + this.#documentDb.detail.update(id, document); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.data.ts similarity index 90% rename from src/Umbraco.Web.UI.Client/src/mocks/data/document.data.ts rename to src/Umbraco.Web.UI.Client/src/mocks/data/document/document.data.ts index 416462c720..a42d05d47d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.data.ts @@ -1,23 +1,17 @@ -import { umbDocumentTypeData } from './document-type/document-type.db.js'; -import { umbUserPermissionData } from './user-permission.data.js'; -import { UmbEntityData } from './entity.data.js'; -import { createDocumentTreeItem } from './utils.js'; -import { UmbMockDocumentTypeModel } from './document-type/document-type.data.js'; -import { - ContentStateModel, +import type { DocumentItemResponseModel, DocumentResponseModel, DocumentTreeItemResponseModel, - DocumentTypeResponseModel, - PagedDocumentTreeItemResponseModel, - PagedDocumentTypeResponseModel, - PagedRecycleBinItemResponseModel, - PublishDocumentRequestModel, - PublishedStateModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UMB_DOCUMENT_ENTITY_TYPE } from '@umbraco-cms/backoffice/document'; +import { ContentStateModel } from '@umbraco-cms/backoffice/backend-api'; -export const data: Array = [ +export type UmbMockDocumentTypeModelHack = DocumentResponseModel & + DocumentTreeItemResponseModel & + DocumentItemResponseModel; + +export interface UmbMockDocumentModel extends Omit {} + +export const data: Array = [ { urls: [ { @@ -25,17 +19,35 @@ export const data: Array = [ url: '/', }, ], - isTrashed: false, - templateId: null, + template: null, id: 'all-property-editors-document-id', - contentTypeId: 'all-property-editors-document-type-id', + parent: null, + documentType: { + id: 'all-property-editors-document-type-id', + icon: 'icon-document', + hasListView: false, + }, + hasChildren: false, + noAccess: false, + isProtected: false, + isTrashed: false, values: [ { alias: 'richTextEditor', culture: null, segment: null, - value: - 'Some value for the RTE with an external link and an internal link foo foo
Macro alias: TestMacro
', + value: { + blocks: {}, + markup: ` +

+ Some value for the RTE with an external link and an internal link foo foo +

+
Macro alias: TestMacro
+

The following tests the embed plugin:

+
+

End of test content

+ `, + }, }, { alias: 'email', @@ -171,7 +183,30 @@ export const data: Array = [ alias: 'blockList', culture: null, segment: null, - value: null, + value: { + layout: { + 'Umbraco.BlockList': [ + { + contentUdi: '1234', + settingsUdi: '5678', + }, + ], + }, + contentData: [ + { + udi: '1234', + contentTypeKey: '4f68ba66-6fb2-4778-83b8-6ab4ca3a7c5c', + elementProperty: 'Hello world', + }, + ], + settingsData: [ + { + udi: '5678', + contentTypeKey: 'all-property-editors-document-type-id', + elementProperty: 'Hello world', + }, + ], + }, }, { alias: 'mediaPicker', @@ -360,9 +395,17 @@ export const data: Array = [ url: '/', }, ], - templateId: null, + template: null, id: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', - contentTypeId: '29643452-cff9-47f2-98cd-7de4b6807681', + parent: null, + documentType: { + id: '29643452-cff9-47f2-98cd-7de4b6807681', + icon: 'icon-document', + hasListView: false, + }, + hasChildren: false, + noAccess: false, + isProtected: false, isTrashed: false, values: [ { @@ -476,9 +519,17 @@ export const data: Array = [ }, { urls: [], - templateId: null, + template: null, id: 'fd56a0b5-01a0-4da2-b428-52773bfa9cc4', - contentTypeId: '29643452-cff9-47f2-98cd-7de4b6807681', + parent: null, + documentType: { + id: '29643452-cff9-47f2-98cd-7de4b6807681', + icon: 'icon-document', + hasListView: false, + }, + hasChildren: false, + noAccess: false, + isProtected: false, isTrashed: false, values: [ { @@ -549,9 +600,17 @@ export const data: Array = [ url: '/', }, ], - templateId: null, + template: null, id: 'simple-document-id', - contentTypeId: 'simple-document-type-id', + parent: null, + documentType: { + id: 'simple-document-type-id', + icon: 'icon-document', + hasListView: false, + }, + hasChildren: false, + noAccess: false, + isProtected: false, isTrashed: false, variants: [ { @@ -574,311 +633,3 @@ export const data: Array = [ ], }, ]; - -export const treeData: Array = [ - { - isProtected: false, - isPublished: true, - isEdited: false, - noAccess: false, - isTrashed: false, - id: 'all-property-editors-document-id', - contentTypeId: 'all-property-editors-document-type-id', - isContainer: false, - parentId: null, - name: 'All property editors', - type: 'document', - icon: 'document', - hasChildren: false, - variants: [ - { - name: 'All property editors', - culture: 'en-us', - state: PublishedStateModel.PUBLISHED, - }, - { - name: 'All property editors', - culture: 'da-dk', - state: PublishedStateModel.PUBLISHED, - }, - ], - }, - { - isProtected: false, - isPublished: true, - isEdited: false, - noAccess: false, - isTrashed: false, - id: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', - contentTypeId: '29643452-cff9-47f2-98cd-7de4b6807681', - isContainer: false, - parentId: null, - name: 'Article in english', - type: 'document', - icon: 'document', - hasChildren: true, - variants: [ - { - state: PublishedStateModel.PUBLISHED, - culture: 'en-us', - name: 'Article in english', - }, - { - state: PublishedStateModel.PUBLISHED, - culture: 'da-dk', - name: 'Artikel på Dansk', - }, - { - state: PublishedStateModel.PUBLISHED, - culture: 'no-no', - name: 'Artikel på Norsk', - }, - { - state: PublishedStateModel.PUBLISHED, - culture: 'es-es', - name: 'Articulo en ingles', - }, - { - state: PublishedStateModel.PUBLISHED, - culture: 'pl-pl', - name: 'Artykuł w języku polskim', - }, - ], - }, - { - isProtected: false, - isPublished: false, - isEdited: false, - noAccess: false, - isTrashed: false, - id: 'fd56a0b5-01a0-4da2-b428-52773bfa9cc4', - contentTypeId: '29643452-cff9-47f2-98cd-7de4b6807681', - isContainer: false, - parentId: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', - name: 'Blog post B', - type: 'document', - icon: 'document', - hasChildren: false, - variants: [ - { - state: PublishedStateModel.UNPUBLISHED, - culture: 'en-us', - name: 'Blog post B', - }, - ], - }, - { - name: 'Simple', - type: 'document', - icon: 'document', - hasChildren: false, - id: 'simple-document-id', - contentTypeId: 'simple-document-type-id', - isContainer: false, - parentId: null, - noAccess: false, - isProtected: false, - isPublished: false, - isEdited: false, - isTrashed: false, - variants: [ - { - state: PublishedStateModel.UNPUBLISHED, - culture: 'en-us', - name: 'Simple Document', - }, - ], - }, -]; - -const createDocumentItem = (item: DocumentResponseModel): DocumentItemResponseModel => { - return { - id: item.id, - name: item.variants?.[0].name, // Hack: TODO: we need to get all variants as part of the document - contentTypeId: item.contentTypeId, - isTrashed: item.isTrashed, - }; -}; - -// TODO: look into making a combined document model so we don't need to maintain two+ data sets. -// Temp mocked database -// TODO: all properties are optional in the server schema. I don't think this is correct. -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -class UmbDocumentData extends UmbEntityData { - private treeData = treeData; - - constructor() { - super(data); - } - - // TODO: Can we do this smarter so we don't need to make this for each mock data: - insert(item: DocumentResponseModel) { - super.insert(item); - this.treeData.push(createDocumentTreeItem(item)); - } - - update(id: string, item: DocumentResponseModel) { - super.save(id, item); - this.treeData = this.treeData.map((x) => { - if (x.id === id) { - return createDocumentTreeItem(item); - } else { - return x; - } - }); - } - - publish(id: string, data: PublishDocumentRequestModel) { - // Update detail data: - const foundIndex = this.data.findIndex((item) => item.id === id); - if (foundIndex !== -1) { - // update - this.data[foundIndex].variants?.forEach((variant) => { - if (data.cultures?.includes(variant.culture ?? '')) { - variant.state = ContentStateModel.PUBLISHED; - } - }); - } - - // TODO: Tree data is not aware about variants and status of variants: so this is not good enough: - this.treeData = this.treeData.map((x) => { - if (x.id && x.id === id) { - return { ...x, isPublished: true }; - } else { - return x; - } - }); - return true; - } - - unpublish(id: string, data: PublishDocumentRequestModel) { - // Update detail data: - const foundIndex = this.data.findIndex((item) => item.id === id); - if (foundIndex !== -1) { - // update - this.data[foundIndex].variants?.forEach((variant) => { - if (data.cultures?.includes(variant.culture ?? '')) { - variant.state = ContentStateModel.DRAFT; - } - }); - } - - // TODO: Tree data is not aware about variants and status of variants: so this is not good enough: - this.treeData = this.treeData.map((x) => { - if (x.id && x.id === id) { - return { ...x, isPublished: false }; - } else { - return x; - } - }); - - return true; - } - - trash(ids: string[]): DocumentResponseModel[] { - const result = super.trash(ids); - this.treeData = this.treeData.map((x) => { - if (x.id && ids.includes(x.id)) { - return { ...x, isTrashed: true }; - } else { - return x; - } - }); - return result; - } - - getTreeRoot(): PagedDocumentTreeItemResponseModel { - const items = this.treeData.filter((item) => item.parentId === null && item.isTrashed === false); - const treeItems = items.map((item) => item); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItemChildrenOf(id: string): PagedDocumentTreeItemResponseModel { - const items = this.treeData.filter((item) => item.parentId === id && item.isTrashed === false); - const treeItems = items.map((item) => item); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItem(ids: Array): Array { - const items = this.treeData.filter((item) => ids.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) => createDocumentItem(item)); - } - - getDocumentByIdAllowedDocumentTypes(id: string): PagedDocumentTypeResponseModel { - const item = this.getById(id); - if (item?.contentTypeId) { - const docType = umbDocumentTypeData.getById(item.contentTypeId); - - if (docType) { - const allowedTypes = docType?.allowedContentTypes ?? []; - const mockedTypes = allowedTypes - .map((allowedType) => umbDocumentTypeData.getById(allowedType.id)) - .filter((item) => item !== undefined) as Array; - const items = mockedTypes.map((item) => mapToDocumentType(item)); - const total = items.length; - return { items, total }; - } - } - return { items: [], total: 0 }; - } - - getAllowedDocumentTypesAtRoot(): PagedDocumentTypeResponseModel { - return umbDocumentTypeData.getAll(); //.filter((docType) => docType.allowedAsRoot); - } - - getRecycleBinRoot(): PagedRecycleBinItemResponseModel { - const items = this.treeData.filter((item) => item.parentId === null && item.isTrashed === true); - const treeItems = items.map((item) => item); - const total = items.length; - return { items: treeItems, total }; - } - - getRecycleBinChildrenOf(parentId: string): PagedRecycleBinItemResponseModel { - const items = this.treeData.filter((item) => item.parentId === parentId && item.isTrashed === true); - const treeItems = items.map((item) => item); - const total = items.length; - return { items: treeItems, total }; - } - - // permissions - - getUserPermissionsForDocument(id: string): Array { - return umbUserPermissionData - .getAll() - .items.filter( - (permission: any) => - permission.target.entityType === UMB_DOCUMENT_ENTITY_TYPE && permission.target.documentId === id, - ); - } -} - -const mapToDocumentType = (item: UmbMockDocumentTypeModel): DocumentTypeResponseModel => { - return { - alias: item.alias, - name: item.name, - description: item.description, - icon: item.icon, - allowedAsRoot: item.allowedAsRoot, - variesByCulture: item.variesByCulture, - variesBySegment: item.variesBySegment, - isElement: item.isElement, - properties: item.properties, - containers: item.containers, - allowedContentTypes: item.allowedContentTypes, - compositions: item.compositions, - id: item.id, - allowedTemplateIds: item.allowedTemplateIds, - defaultTemplateId: item.defaultTemplateId, - cleanup: item.cleanup, - }; -}; - -export const umbDocumentData = new UmbDocumentData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts new file mode 100644 index 0000000000..c723893218 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts @@ -0,0 +1,116 @@ +import { UmbMockEntityTreeManager } from '../entity/entity-tree.manager.js'; +import { UmbMockEntityItemManager } from '../entity/entity-item.manager.js'; +import { UmbMockEntityDetailManager } from '../entity/entity-detail.manager.js'; +import { umbDocumentTypeMockDb } from '../document-type/document-type.db.js'; +import { UmbEntityMockDbBase } from '../entity/entity-base.js'; +import { UmbEntityRecycleBin } from '../entity/entity-recycle-bin.js'; +import type { UmbMockDocumentModel } from './document.data.js'; +import { data } from './document.data.js'; +import { UmbMockDocumentPublishingManager } from './document-publishing.manager.js'; +import { + ContentStateModel, + type CreateDocumentRequestModel, + type DocumentItemResponseModel, + type DocumentResponseModel, + type DocumentTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbId } from '@umbraco-cms/backoffice/id'; + +export class UmbDocumentMockDB extends UmbEntityMockDbBase { + tree = new UmbMockEntityTreeManager(this, treeItemMapper); + item = new UmbMockEntityItemManager(this, itemMapper); + detail = new UmbMockEntityDetailManager(this, createMockDocumentMapper, detailResponseMapper); + recycleBin = new UmbEntityRecycleBin(this.data, treeItemMapper); + publishing = new UmbMockDocumentPublishingManager(this); + + constructor(data: Array) { + super(data); + } + + // permissions + getUserPermissionsForDocument(id: string): Array { + return []; + } +} + +const treeItemMapper = (model: UmbMockDocumentModel): Omit => { + const documentType = umbDocumentTypeMockDb.read(model.documentType.id); + if (!documentType) throw new Error(`Document type with id ${model.documentType.id} not found`); + + return { + documentType: { + hasListView: false, + icon: documentType.icon, + id: documentType.id, + }, + hasChildren: model.hasChildren, + id: model.id, + isProtected: model.isProtected, + isTrashed: model.isTrashed, + noAccess: model.noAccess, + parent: model.parent, + variants: model.variants, + }; +}; + +const createMockDocumentMapper = (request: CreateDocumentRequestModel): UmbMockDocumentModel => { + const documentType = umbDocumentTypeMockDb.read(request.documentType.id); + if (!documentType) throw new Error(`Document type with id ${request.documentType.id} not found`); + + const now = new Date().toString(); + + return { + documentType: { + id: documentType.id, + icon: documentType.icon, + hasListView: false, // TODO: get list from doc type when ready + }, + hasChildren: false, + id: request.id ? request.id : UmbId.new(), + isProtected: false, + isTrashed: false, + noAccess: false, + parent: request.parent, + values: request.values, + variants: request.variants.map((variantRequest) => { + return { + culture: variantRequest.culture, + segment: variantRequest.segment, + name: variantRequest.name, + createDate: now, + updateDate: now, + state: ContentStateModel.DRAFT, + publishDate: null, + }; + }), + urls: [], + }; +}; + +const detailResponseMapper = (model: UmbMockDocumentModel): DocumentResponseModel => { + return { + documentType: model.documentType, + id: model.id, + isTrashed: model.isTrashed, + template: model.template, + urls: model.urls, + values: model.values, + variants: model.variants, + }; +}; + +const itemMapper = (model: UmbMockDocumentModel): DocumentItemResponseModel => { + return { + documentType: { + hasListView: model.documentType.hasListView, + icon: model.documentType.icon, + id: model.documentType.id, + }, + id: model.id, + isProtected: model.isProtected, + isTrashed: model.isTrashed, + variants: model.variants, + }; +}; + +export const umbDocumentMockDb = new UmbDocumentMockDB(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity-tree.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity-tree.data.ts deleted file mode 100644 index c5436a0e15..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/entity-tree.data.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { UmbEntityData } from './entity.data.js'; -import { TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbId } from '@umbraco-cms/backoffice/id'; - -export class UmbEntityTreeData { - #detailDatabase: UmbEntityData; - - constructor(detailDatabase: UmbEntityData) { - this.#detailDatabase = detailDatabase; - } - - move(ids: Array, destinationId: string) { - const destinationItem = this.#detailDatabase.getById(destinationId); - if (!destinationItem) throw new Error(`Destination item with key ${destinationId} not found`); - - const items = this.#detailDatabase.getByIds(ids); - const movedItems = items.map((item) => { - return { - ...item, - parentId: destinationId, - }; - }); - - movedItems.forEach((movedItem) => this.#detailDatabase.updateData(movedItem)); - destinationItem.hasChildren = true; - this.#detailDatabase.updateData(destinationItem); - } - - copy(ids: Array, destinationKey: string) { - const destinationItem = this.#detailDatabase.getById(destinationKey); - if (!destinationItem) throw new Error(`Destination item with key ${destinationKey} not found`); - - // TODO: Notice we don't add numbers to the 'copy' name. - const items = this.#detailDatabase.getByIds(ids); - const copyItems = items.map((item) => { - return { - ...item, - name: item.name + ' Copy', - id: UmbId.new(), - parentId: destinationKey, - }; - }); - - copyItems.forEach((copyItem) => this.#detailDatabase.insert(copyItem)); - const newIds = copyItems.map((item) => item.id); - - destinationItem.hasChildren = true; - this.#detailDatabase.updateData(destinationItem); - - return newIds; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-base.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-base.ts new file mode 100644 index 0000000000..42dee34374 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-base.ts @@ -0,0 +1,24 @@ +import { UmbData } from '../data.js'; + +export abstract class UmbEntityMockDbBase extends UmbData { + constructor(data: Array) { + super(data); + } + + create(item: MockItemType) { + this.data.push(item); + } + + read(id: string) { + return this.data.find((item) => item.id === id); + } + + update(id: string, updatedItem: MockItemType) { + const itemIndex = this.data.findIndex((item) => item.id === id); + this.data[itemIndex] = updatedItem; + } + + delete(id: string) { + this.data = this.data.filter((item) => item.id !== id); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-detail.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-detail.manager.ts new file mode 100644 index 0000000000..121808adcc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-detail.manager.ts @@ -0,0 +1,46 @@ +import type { UmbEntityMockDbBase } from './entity-base.js'; + +export class UmbMockEntityDetailManager { + #db: UmbEntityMockDbBase; + #createMockItemMapper: (request: any) => MockType; + #readResponseMapper: (mockItem: MockType) => any; + + constructor( + db: UmbEntityMockDbBase, + createMockItemMapper: (request: any) => MockType, + readResponseMapper: (mockItem: MockType) => any, + ) { + this.#db = db; + this.#createMockItemMapper = createMockItemMapper; + this.#readResponseMapper = readResponseMapper; + } + + create(request: any) { + const mockItem = this.#createMockItemMapper(request); + // create mock item in mock db + this.#db.create(mockItem); + return mockItem.id; + } + + read(id: string) { + const item = this.#db.read(id); + if (!item) throw new Error('Item not found'); + const mappedItem = this.#readResponseMapper(item); + return mappedItem; + } + + update(id: string, item: any) { + const mockItem = this.#db.read(id); + + const updatedMockItem = { + ...mockItem, + ...item, + } as unknown as MockType; + + this.#db.update(id, updatedMockItem); + } + + delete(path: string) { + this.#db.delete(path); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-folder.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-folder.manager.ts new file mode 100644 index 0000000000..692ab9afd9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-folder.manager.ts @@ -0,0 +1,61 @@ +import type { UmbEntityMockDbBase } from './entity-base.js'; +import type { + CreateFolderRequestModel, + FolderResponseModel, + FolderTreeItemResponseModel, + UpdateFolderResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockEntityFolderManager> { + #db: UmbEntityMockDbBase; + #createMockFolderMapper: (request: CreateFolderRequestModel) => MockItemType; + + constructor( + db: UmbEntityMockDbBase, + createMockFolderMapper: (request: CreateFolderRequestModel) => MockItemType, + ) { + this.#db = db; + this.#createMockFolderMapper = createMockFolderMapper; + } + + create(request: CreateFolderRequestModel) { + const newFolder = this.#createMockFolderMapper(request); + this.#db.create(newFolder); + return newFolder.id; + } + + read(id: string) { + const mockItem = this.#db.read(id); + if (mockItem?.isFolder) { + return this.#defaultReadMapper(mockItem); + } else { + return undefined; + } + } + + update(id: string, request: UpdateFolderResponseModel) { + const mockItem = this.#db.read(id); + + const updatedMockItem = { + ...mockItem, + name: request.name, + } as unknown as MockItemType; + + this.#db.update(id, updatedMockItem); + } + + delete(id: string) { + const dbItem = this.#db.read(id); + if (dbItem?.isFolder) { + this.#db.delete(id); + } + } + + #defaultReadMapper = (item: MockItemType): FolderResponseModel => { + return { + name: item.name, + id: item.id, + parentId: item.parent ? item.parent.id : null, + }; + }; +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-item.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-item.manager.ts new file mode 100644 index 0000000000..0a5f1bccbb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-item.manager.ts @@ -0,0 +1,16 @@ +import type { UmbData } from '../data.js'; + +export class UmbMockEntityItemManager { + #db: UmbData; + #itemReadMapper: (item: T) => any; + + constructor(db: UmbData, itemReadMapper: (item: T) => any) { + this.#db = db; + this.#itemReadMapper = itemReadMapper; + } + + getItems(ids: Array) { + const items = this.#db.getData().filter((item) => ids.includes(item.id)); + return items.map((item) => this.#itemReadMapper(item)); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-recycle-bin.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-recycle-bin.ts new file mode 100644 index 0000000000..5eefd81b76 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-recycle-bin.ts @@ -0,0 +1,26 @@ +import { UmbEntityMockDbBase } from './entity-base.js'; +import { UmbMockEntityTreeManager } from './entity-tree.manager.js'; +import type { ContentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbEntityRecycleBin< + MockType extends Omit, +> extends UmbEntityMockDbBase { + tree; + + constructor(data: Array, treeItemMapper: (model: MockType) => any) { + super(data); + this.tree = new UmbMockEntityTreeManager(this, treeItemMapper); + } + + trash(ids: string[]) { + const models = ids.map((id) => this.read(id)).filter((model) => !!model) as Array; + + models.forEach((model) => { + model.isTrashed = true; + }); + + models.forEach((model) => { + this.update(model.id, model); + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-tree.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-tree.manager.ts new file mode 100644 index 0000000000..b066aa74b3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/entity/entity-tree.manager.ts @@ -0,0 +1,82 @@ +import type { UmbEntityMockDbBase } from './entity-base.js'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockEntityTreeManager> { + #db: UmbEntityMockDbBase; + #treeItemMapper: (item: T) => any; + + constructor(mockDb: UmbEntityMockDbBase, treeItemMapper: (item: T) => any) { + this.#db = mockDb; + this.#treeItemMapper = treeItemMapper; + } + + getRoot() { + const items = this.#db.getData().filter((item) => item.parent === null); + const treeItems = items.map((item) => this.#treeItemMapper(item)); + const total = items.length; + return { items: treeItems, total }; + } + + getChildrenOf(parentId: string) { + const items = this.#db.getData().filter((item) => item.parent?.id === parentId); + const treeItems = items.map((item) => this.#treeItemMapper(item)); + const total = items.length; + return { items: treeItems, total }; + } + + move(ids: Array, destinationId: string) { + const destinationItem = this.#db.read(destinationId); + if (!destinationItem) throw new Error(`Destination item with id ${destinationId} not found`); + + const items: Array = []; + + ids.forEach((id) => { + const item = this.#db.read(id); + if (!item) throw new Error(`Item with id ${id} not found`); + items.push(item); + }); + + const movedItems = items.map((item) => { + return { + ...item, + parentId: destinationId, + }; + }); + + movedItems.forEach((movedItem: any) => this.#db.update(movedItem.id, movedItem)); + destinationItem.hasChildren = true; + this.#db.update(destinationItem.id, destinationItem); + } + + copy(ids: Array, destinationId: string) { + const destinationItem = this.#db.read(destinationId); + if (!destinationItem) throw new Error(`Destination item with id ${destinationId} not found`); + + // TODO: Notice we don't add numbers to the 'copy' name. + const items: Array = []; + + ids.forEach((id) => { + const item = this.#db.read(id); + if (!item) throw new Error(`Item with id ${id} not found`); + items.push(item); + }); + + const copyItems = items.map((item) => { + return { + ...item, + name: item.name + ' Copy', + id: UmbId.new(), + parentId: destinationId, + }; + }); + + copyItems.forEach((copyItem) => this.#db.create(copyItem)); + const newIds = copyItems.map((item) => item.id); + + destinationItem.hasChildren = true; + this.#db.update(destinationItem.id, destinationItem); + + return newIds; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/examine.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/examine.data.ts index a3d2414098..f096f16438 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/examine.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/examine.data.ts @@ -1,8 +1,9 @@ -import { - HealthStatusModel, +import type { IndexResponseModel, PagedIndexResponseModel, - SearchResultResponseModel, + SearchResultResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { + HealthStatusModel } from '@umbraco-cms/backoffice/backend-api'; export function getIndexByName(indexName: string) { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-base.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-base.ts new file mode 100644 index 0000000000..c1df92fda7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-base.ts @@ -0,0 +1,27 @@ +import { UmbData } from '../data.js'; +import type { FileSystemResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; + +export abstract class UmbFileSystemMockDbBase< + MockItemType extends FileSystemResponseModelBaseModel, +> extends UmbData { + constructor(data: Array) { + super(data); + } + + create(item: MockItemType) { + this.data.push(item); + } + + read(path: string) { + return this.data.find((item) => item.path === path); + } + + update(existingPath: string, updatedItem: MockItemType) { + const itemIndex = this.data.findIndex((item) => item.path === existingPath); + this.data[itemIndex] = updatedItem; + } + + delete(path: string) { + this.data = this.data.filter((item) => item.path !== path); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-detail.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-detail.manager.ts new file mode 100644 index 0000000000..d9c509814f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-detail.manager.ts @@ -0,0 +1,83 @@ +import type { UmbFileSystemMockDbBase } from './file-system-base.js'; +import type { + FileSystemFileCreateRequestModelBaseModel, + FileSystemFileResponseModelBaseModel, + FileSystemFileUpdateRequestModelBaseModel, + FileSystemResponseModelBaseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockFileSystemDetailManager { + #db: UmbFileSystemMockDbBase; + + constructor(db: UmbFileSystemMockDbBase) { + this.#db = db; + } + + create(request: FileSystemFileCreateRequestModelBaseModel) { + let path = request.parent ? `${request.parent.path}/${request.name}` : request.name; + // ensure dash prefix if its not there + path = path.startsWith('/') ? path : `/${path}`; + + const mockItem = this.#defaultCreateMockItemMapper(path, request); + // create mock item in mock db + this.#db.create(mockItem); + return path; + } + + read(path: string): FileSystemResponseModelBaseModel | undefined { + const item = this.#db.read(path); + if (!item) throw new Error('Item not found'); + const mappedItem = this.#defaultReadResponseMapper(item); + return mappedItem; + } + + update(path: string, item: FileSystemFileUpdateRequestModelBaseModel) { + const mockItem = this.#db.read(path); + + const updatedMockItem = { + ...mockItem, + content: item.content, + } as unknown as MockItemType; + + this.#db.update(path, updatedMockItem); + } + + delete(path: string) { + this.#db.delete(path); + } + + rename(path: string, name: string) { + const currentMockItem = this.#db.read(path); + if (!currentMockItem) throw new Error('Item not found'); + + const createRequest: FileSystemFileCreateRequestModelBaseModel = { + name, + parent: currentMockItem.parent, + content: currentMockItem.content, + }; + + this.delete(path); + const newPath = this.create(createRequest); + return newPath; + } + + #defaultCreateMockItemMapper = (path: string, request: FileSystemFileCreateRequestModelBaseModel): MockItemType => { + return { + name: request.name, + content: request.content, + path: path, + parent: request.parent || null, + isFolder: false, + hasChildren: false, + } as unknown as MockItemType; + }; + + #defaultReadResponseMapper = (item: MockItemType): FileSystemFileResponseModelBaseModel => { + return { + path: item.path, + parent: item.parent, + name: item.name, + content: item.content, + }; + }; +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-folder.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-folder.manager.ts new file mode 100644 index 0000000000..b0082c5210 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-folder.manager.ts @@ -0,0 +1,58 @@ +import type { UmbFileSystemMockDbBase } from './file-system-base.js'; +import type { + FileSystemCreateRequestModelBaseModel, + FileSystemResponseModelBaseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockFileSystemFolderManager< + MockItemType extends FileSystemResponseModelBaseModel & { isFolder: boolean }, +> { + #db: UmbFileSystemMockDbBase; + + constructor(db: UmbFileSystemMockDbBase) { + this.#db = db; + } + + create(request: FileSystemCreateRequestModelBaseModel) { + let path = request.parent ? `${request.parent.path}/${request.name}` : request.name; + // ensure dash prefix if its not there + path = path.startsWith('/') ? path : `/${path}`; + + const newFolder = { + path, + parent: request.parent ? { path: request.parent.path } : null, + name: request.name, + hasChildren: false, + isFolder: true, + content: '', + } as unknown as MockItemType; + + this.#db.create(newFolder); + + return path; + } + + read(path: string) { + const mockItem = this.#db.read(path); + if (mockItem?.isFolder) { + return this.#defaultReadMapper(mockItem); + } else { + return undefined; + } + } + + delete(path: string) { + const dbItem = this.#db.read(path); + if (dbItem?.isFolder) { + this.#db.delete(path); + } + } + + #defaultReadMapper = (item: MockItemType): FileSystemResponseModelBaseModel => { + return { + path: item.path, + name: item.name, + parent: item.parent, + }; + }; +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-item.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-item.manager.ts new file mode 100644 index 0000000000..d3d42517f8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-item.manager.ts @@ -0,0 +1,22 @@ +import type { UmbData } from '../data.js'; +import type { FileSystemItemResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockFileSystemItemManager { + #db: UmbData; + + constructor(db: UmbData) { + this.#db = db; + } + + getItems(paths: Array) { + const items = this.#db.getData().filter((item) => paths.includes(item.path)); + return items.map((item) => createFileItemResponseModelBaseModel(item)); + } +} + +const createFileItemResponseModelBaseModel = (item: any): FileSystemItemResponseModelBaseModel => ({ + path: item.path, + name: item.name, + parent: item.parent, + isFolder: item.isFolder, +}); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-tree.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-tree.manager.ts new file mode 100644 index 0000000000..af4349f932 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-tree.manager.ts @@ -0,0 +1,32 @@ +import type { UmbData } from '../data.js'; +import { createFileSystemTreeItem } from '../utils.js'; +import type { + FileSystemTreeItemPresentationModel} from '@umbraco-cms/backoffice/backend-api'; +import { + PagedFileSystemTreeItemPresentationModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockFileSystemTreeManager> { + #db: UmbData; + + constructor(mockDb: UmbData) { + this.#db = mockDb; + } + + getRoot(): { items: Array>; total: number } { + const items = this.#db.getData().filter((item) => item.parent === null); + const treeItems = items.map((item) => createFileSystemTreeItem(item)); + const total = items.length; + return { items: treeItems, total }; + } + + getChildrenOf(parentPath: string): { + items: Array>; + total: number; + } { + const items = this.#db.getData().filter((item) => item.parent?.path === parentPath); + const treeItems = items.map((item) => createFileSystemTreeItem(item)); + const total = items.length; + return { items: treeItems, total }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/index.ts new file mode 100644 index 0000000000..d60d80fbc5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/index.ts @@ -0,0 +1 @@ +export * from './parent-path-from-server-path.function.js'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/parent-path-from-server-path.function.test.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/parent-path-from-server-path.function.test.ts new file mode 100644 index 0000000000..6adcd962cf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/parent-path-from-server-path.function.test.ts @@ -0,0 +1,15 @@ +import { expect } from '@open-wc/testing'; +import { getParentPathFromServerPath } from './parent-path-from-server-path.function.js'; + +describe('parent-path-from-server-path', () => { + it('it returns the parent path of a nested server path', () => { + const path = 'Folder A/Folder AA/Folder AAA'; + const expectedParentPath = 'Folder A/Folder AA'; + expect(getParentPathFromServerPath(path)).to.equal(expectedParentPath); + }); + + it('it returns null of a root server path', () => { + const path = 'Folder A'; + expect(getParentPathFromServerPath(path)).to.be.null; + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/parent-path-from-server-path.function.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/parent-path-from-server-path.function.ts new file mode 100644 index 0000000000..3930a27324 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/util/parent-path-from-server-path.function.ts @@ -0,0 +1,4 @@ +export const getParentPathFromServerPath = (serverPath: string): string | null => { + const parentPath = serverPath.substring(0, serverPath.lastIndexOf('/')); + return parentPath || null; +}; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/health-check.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/health-check.data.ts index 7e90796849..bfb85fb276 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/health-check.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/health-check.data.ts @@ -1,6 +1,7 @@ -import { +import type { HealthCheckGroupPresentationModel, - HealthCheckGroupWithResultResponseModel, + HealthCheckGroupWithResultResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { StatusResultTypeModel, } from '@umbraco-cms/backoffice/backend-api'; @@ -16,26 +17,6 @@ export const healthGroups: Array { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/log-viewer.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/log-viewer.data.ts index 05cff127b8..30be1e924e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/log-viewer.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/log-viewer.data.ts @@ -1,6 +1,6 @@ import { logs } from './logs.data.js'; import { UmbData } from './data.js'; -import { +import type { LogMessageResponseModel, LogTemplateResponseModel, SavedLogSearchResponseModel, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/logs.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/logs.data.ts index 3644619ce4..0fafbc8a38 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/logs.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/logs.data.ts @@ -1,4 +1,5 @@ -import { LogLevelModel, LogMessageResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { LogMessageResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { LogLevelModel } from '@umbraco-cms/backoffice/backend-api'; const allLogs = [ { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media-type.data.ts deleted file mode 100644 index e06403f0f9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/media-type.data.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { UmbEntityData } from './entity.data.js'; -import { createMediaTypeTreeItem } from './utils.js'; -import { - MediaTypeItemResponseModel, - MediaTypeResponseModel, - MediaTypeTreeItemResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; - -export const data: Array = [ - { - name: 'Media Type 1', - id: 'c5159663-eb82-43ee-bd23-e42dc5e71db6', - description: 'Media type 1 description', - alias: 'mediaType1', - icon: 'icon-bug', - properties: [], - containers: [], - allowedAsRoot: false, - variesByCulture: false, - variesBySegment: false, - isElement: false, - allowedContentTypes: [], - compositions: [], - }, -]; - -export const treeData: Array = [ - { - name: data[0].name, - id: data[0].id, - icon: data[0].icon, - type: 'media-type', - hasChildren: false, - isContainer: false, - parentId: null, - isFolder: false, - }, -]; - -// Temp mocked database -// TODO: all properties are optional in the server schema. I don't think this is correct. -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -class UmbMediaTypeData extends UmbEntityData { - private treeData = treeData; - - constructor() { - super(data); - } - - // TODO: Can we do this smarter so we don't need to make this for each mock data: - insert(item: MediaTypeResponseModel) { - super.insert(item); - this.treeData.push(createMediaTypeTreeItem(item)); - } - - update(id: string, item: MediaTypeResponseModel) { - super.save(id, item); - this.treeData = this.treeData.map((x) => { - if (x.id === id) { - return createMediaTypeTreeItem(item); - } else { - return x; - } - }); - } - - getItems(ids: Array): Array { - const items = this.data.filter((item) => ids.includes(item.id ?? '')); - return items.map((item) => createMediaTypeItem(item)); - } - - getTreeRoot(): Array { - return this.treeData.filter((item) => item.parentId === null); - } - - getTreeItemChildren(id: string): Array { - const childItems = this.treeData.filter((item) => item.parentId === id); - return childItems.map((item) => item); - } - - getTreeItems(ids: Array): Array { - const items = this.treeData.filter((item) => ids.includes(item.id ?? '')); - return items.map((item) => item); - } - - getAllowedTypesOf(id: string): Array { - const mediaType = this.getById(id); - const allowedTypeKeys = mediaType?.allowedContentTypes?.map((mediaType) => mediaType.id) ?? []; - const items = this.treeData.filter((item) => allowedTypeKeys.includes(item.id ?? '')); - return items.map((item) => item); - } -} - -const createMediaTypeItem = (item: MediaTypeResponseModel): MediaTypeItemResponseModel => { - return { - id: item.id, - name: item.name, - icon: item.icon, - }; -}; - -export const umbMediaTypeData = new UmbMediaTypeData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.data.ts new file mode 100644 index 0000000000..6eabf86bc8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.data.ts @@ -0,0 +1,32 @@ +import type { + MediaTypeItemResponseModel, + MediaTypeResponseModel, + MediaTypeTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export type UmbMockMediaTypeModelHack = MediaTypeResponseModel & + MediaTypeTreeItemResponseModel & + MediaTypeItemResponseModel; + +export interface UmbMockMediaTypeModel extends Omit {} + +export const data: Array = [ + { + name: 'Media Type 1', + id: 'media-type-1-id', + parent: null, + description: 'Media type 1 description', + alias: 'mediaType1', + icon: 'icon-bug', + properties: [], + containers: [], + allowedAsRoot: false, + variesByCulture: false, + variesBySegment: false, + isElement: false, + allowedMediaTypes: [], + compositions: [], + isFolder: false, + hasChildren: false, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.db.ts new file mode 100644 index 0000000000..d6b6fe15d0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.db.ts @@ -0,0 +1,111 @@ +import { UmbEntityMockDbBase } from '../entity/entity-base.js'; +import { UmbMockEntityFolderManager } from '../entity/entity-folder.manager.js'; +import { UmbMockEntityTreeManager } from '../entity/entity-tree.manager.js'; +import { UmbMockEntityItemManager } from '../entity/entity-item.manager.js'; +import { UmbMockEntityDetailManager } from '../entity/entity-detail.manager.js'; +import type { UmbMockMediaTypeModel } from './media-type.data.js'; +import { data } from './media-type.data.js'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { + CreateFolderRequestModel, + CreateMediaTypeRequestModel, + MediaTypeItemResponseModel, + MediaTypeResponseModel, + MediaTypeTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +class UmbMediaTypeMockDB extends UmbEntityMockDbBase { + tree = new UmbMockEntityTreeManager(this, mediaTypeTreeItemMapper); + folder = new UmbMockEntityFolderManager(this, createMockMediaTypeFolderMapper); + item = new UmbMockEntityItemManager(this, mediaTypeItemMapper); + detail = new UmbMockEntityDetailManager( + this, + createMockMediaTypeMapper, + mediaTypeDetailMapper, + ); + + constructor(data: Array) { + super(data); + } +} + +const createMockMediaTypeFolderMapper = (request: CreateFolderRequestModel): UmbMockMediaTypeModel => { + return { + name: request.name, + id: request.id ? request.id : UmbId.new(), + parent: request.parentId ? { id: request.parentId } : null, + description: '', + alias: '', + icon: '', + properties: [], + containers: [], + allowedAsRoot: false, + variesByCulture: false, + variesBySegment: false, + isElement: false, + allowedMediaTypes: [], + compositions: [], + isFolder: true, + hasChildren: false, + }; +}; + +const createMockMediaTypeMapper = (request: CreateMediaTypeRequestModel): UmbMockMediaTypeModel => { + return { + name: request.name, + id: request.id ? request.id : UmbId.new(), + description: request.description, + alias: request.alias, + icon: request.icon, + properties: request.properties, + containers: request.containers, + allowedAsRoot: request.allowedAsRoot, + variesByCulture: request.variesByCulture, + variesBySegment: request.variesBySegment, + isElement: request.isElement, + allowedMediaTypes: request.allowedMediaTypes, + compositions: request.compositions, + parent: request.folder ? { id: request.folder.id } : null, + isFolder: false, + hasChildren: false, + }; +}; + +const mediaTypeDetailMapper = (item: UmbMockMediaTypeModel): MediaTypeResponseModel => { + return { + name: item.name, + id: item.id, + description: item.description, + alias: item.alias, + icon: item.icon, + properties: item.properties, + containers: item.containers, + allowedAsRoot: item.allowedAsRoot, + variesByCulture: item.variesByCulture, + variesBySegment: item.variesBySegment, + isElement: item.isElement, + allowedMediaTypes: item.allowedMediaTypes, + compositions: item.compositions, + }; +}; + +const mediaTypeTreeItemMapper = (item: UmbMockMediaTypeModel): Omit => { + return { + name: item.name, + hasChildren: item.hasChildren, + id: item.id, + parent: item.parent, + isFolder: item.isFolder, + icon: item.icon, + }; +}; + +const mediaTypeItemMapper = (item: UmbMockMediaTypeModel): MediaTypeItemResponseModel => { + return { + id: item.id, + name: item.name, + icon: item.icon, + }; +}; + +export const umbMediaTypeMockDb = new UmbMediaTypeMockDB(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media.data.ts deleted file mode 100644 index 20e4dc1dfa..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/media.data.ts +++ /dev/null @@ -1,239 +0,0 @@ -import type { UmbMediaDetailModel } from '../../packages/media/media/index.js'; -import { UmbEntityTreeData } from './entity-tree.data.js'; -import { UmbEntityData } from './entity.data.js'; -import { createContentTreeItem, createMediaTreeItem } from './utils.js'; -import { - ContentTreeItemResponseModel, - MediaItemResponseModel, - PagedMediaTreeItemResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; - -export const data: Array = [ - { - name: 'Flipped Car', - type: 'media', - hasChildren: false, - id: 'f2f81a40-c989-4b6b-84e2-057cecd3adc1', - isContainer: false, - parentId: null, - noAccess: false, - isTrashed: false, - properties: [ - { - alias: 'myMediaHeadline', - label: 'Media Headline', - description: 'Text string property', - dataTypeId: 'dt-textBox', - }, - ], - data: [ - { - alias: 'myMediaHeadline', - value: 'The daily life at Umbraco HQ', - }, - ], - variants: [], - }, - { - name: 'Umbracoffee', - type: 'media', - hasChildren: false, - id: '69431027-8867-45bf-a93b-72bbdabfb177', - isContainer: false, - parentId: null, - noAccess: false, - isTrashed: false, - properties: [ - { - alias: 'myMediaDescription', - label: 'Description', - description: 'Textarea property', - dataTypeId: 'dt-textArea', - }, - ], - data: [ - { - alias: 'myMediaDescription', - value: 'Every day, a rabbit in a military costume greets me at the front door', - }, - ], - variants: [], - }, - { - name: 'People', - type: 'media', - hasChildren: true, - id: '69461027-8867-45bf-a93b-72bbdabfb177', - isContainer: true, - parentId: null, - noAccess: false, - isTrashed: false, - properties: [], - data: [], - variants: [], - }, - { - name: 'Products', - type: 'media', - hasChildren: true, - id: '69461027-8867-45bf-a93b-5224dabfb177', - isContainer: true, - parentId: null, - noAccess: false, - isTrashed: false, - properties: [], - data: [], - variants: [], - }, - { - name: 'John Smith', - type: 'media', - hasChildren: false, - id: '69431027-8867-45s7-a93b-7uibdabfb177', - isContainer: false, - parentId: '69461027-8867-45bf-a93b-72bbdabfb177', - noAccess: false, - isTrashed: false, - properties: [ - { - alias: 'myMediaDescription', - label: 'Description', - description: 'Textarea property', - dataTypeId: 'dt-textArea', - }, - ], - data: [ - { - alias: 'myMediaDescription', - value: 'Every day, a rabbit in a military costume greets me at the front door', - }, - ], - variants: [], - }, - { - name: 'Jane Doe', - type: 'media', - hasChildren: false, - id: '69431027-8867-45s7-a93b-7uibdabf2147', - isContainer: false, - parentId: '69461027-8867-45bf-a93b-72bbdabfb177', - noAccess: false, - isTrashed: false, - properties: [ - { - alias: 'myMediaDescription', - label: 'Description', - description: 'Textarea property', - dataTypeId: 'dt-textArea', - }, - ], - data: [ - { - alias: 'myMediaDescription', - value: 'Every day, a rabbit in a military costume greets me at the front door', - }, - ], - variants: [], - }, - { - name: 'A very nice hat', - type: 'media', - hasChildren: false, - id: '694hdj27-8867-45s7-a93b-7uibdabf2147', - isContainer: false, - parentId: '69461027-8867-45bf-a93b-5224dabfb177', - noAccess: false, - isTrashed: false, - properties: [ - { - alias: 'myMediaDescription', - label: 'Description', - description: 'Textarea property', - dataTypeId: 'dt-textArea', - }, - ], - data: [ - { - alias: 'myMediaDescription', - value: 'Every day, a rabbit in a military costume greets me at the front door', - }, - ], - variants: [], - }, - { - name: 'Fancy old chair', - type: 'media', - hasChildren: false, - id: '694hdj27-1237-45s7-a93b-7uibdabfas47', - isContainer: false, - parentId: '69461027-8867-45bf-a93b-5224dabfb177', - noAccess: false, - isTrashed: false, - properties: [ - { - alias: 'myMediaDescription', - label: 'Description', - description: 'Textarea property', - dataTypeId: 'dt-textArea', - }, - ], - data: [ - { - alias: 'myMediaDescription', - value: 'Every day, a rabbit in a military costume greets me at the front door', - }, - ], - variants: [], - }, -]; - -const createMediaItem = (item: UmbMediaDetailModel): MediaItemResponseModel => { - return { - id: item.id, - name: item.name, - icon: item.icon, - isTrashed: false, - }; -}; - -// Temp mocked database -// TODO: all properties are optional in the server schema. I don't think this is correct. -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -class UmbMediaData extends UmbEntityData { - #tree = new UmbEntityTreeData(this); - - constructor() { - super(data); - } - - getItems(ids: Array): Array { - const items = this.data.filter((item) => ids.includes(item.id ?? '')); - return items.map((item) => createMediaItem(item)); - } - - getTreeRoot(): PagedMediaTreeItemResponseModel { - const items = this.data.filter((item) => item.parentId === null); - const treeItems = items.map((item) => createMediaTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItemChildren(id: string): PagedMediaTreeItemResponseModel { - const items = this.data.filter((item) => item.parentId === id); - const treeItems = items.map((item) => createMediaTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItem(ids: Array): Array { - const items = this.data.filter((item) => ids.includes(item.id)); - return items.map((item) => createMediaTreeItem(item)); - } - - move(ids: Array, destinationKey: string) { - return this.#tree.move(ids, destinationKey); - } -} - -export const umbMediaData = new UmbMediaData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.data.ts new file mode 100644 index 0000000000..5606b99e7e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.data.ts @@ -0,0 +1,233 @@ +import { + ContentStateModel, + type MediaItemResponseModel, + type MediaResponseModel, + type MediaTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export type UmbMockMediaModelHack = MediaResponseModel & MediaTreeItemResponseModel & MediaItemResponseModel; + +export interface UmbMockMediaModel extends Omit {} + +export const data: Array = [ + { + hasChildren: false, + id: 'f2f81a40-c989-4b6b-84e2-057cecd3adc1', + parent: null, + noAccess: false, + isTrashed: false, + mediaType: { + id: 'media-type-1-id', + icon: 'icon-bug', + hasListView: false, + }, + values: [ + { + alias: 'myMediaHeadline', + value: 'The daily life at Umbraco HQ', + }, + ], + variants: [ + { + state: ContentStateModel.PUBLISHED, + publishDate: '2023-02-06T15:31:51.354764', + culture: 'en-us', + segment: null, + name: 'Flipped Car', + createDate: '2023-02-06T15:31:46.876902', + updateDate: '2023-02-06T15:31:51.354764', + }, + ], + urls: [], + }, + { + hasChildren: false, + id: '69431027-8867-45bf-a93b-72bbdabfb177', + parent: null, + noAccess: false, + isTrashed: false, + mediaType: { + id: 'media-type-1-id', + icon: 'icon-bug', + hasListView: false, + }, + values: [ + { + alias: 'myMediaDescription', + value: 'Every day, a rabbit in a military costume greets me at the front door', + }, + ], + variants: [ + { + state: ContentStateModel.PUBLISHED, + publishDate: '2023-02-06T15:31:51.354764', + culture: 'en-us', + segment: null, + name: 'Umbracoffee', + createDate: '2023-02-06T15:31:46.876902', + updateDate: '2023-02-06T15:31:51.354764', + }, + ], + urls: [], + }, + { + hasChildren: true, + id: '69461027-8867-45bf-a93b-72bbdabfb177', + parent: null, + noAccess: false, + isTrashed: false, + mediaType: { + id: 'media-type-1-id', + icon: 'icon-bug', + hasListView: false, + }, + values: [], + variants: [ + { + state: ContentStateModel.PUBLISHED, + publishDate: '2023-02-06T15:31:51.354764', + culture: 'en-us', + segment: null, + name: 'People', + createDate: '2023-02-06T15:31:46.876902', + updateDate: '2023-02-06T15:31:51.354764', + }, + ], + urls: [], + }, + { + hasChildren: true, + id: '69461027-8867-45bf-a93b-5224dabfb177', + parent: null, + noAccess: false, + isTrashed: false, + mediaType: { + id: 'media-type-1-id', + icon: 'icon-bug', + hasListView: false, + }, + values: [], + variants: [ + { + state: ContentStateModel.PUBLISHED, + publishDate: '2023-02-06T15:31:51.354764', + culture: 'en-us', + segment: null, + name: 'John Smith', + createDate: '2023-02-06T15:31:46.876902', + updateDate: '2023-02-06T15:31:51.354764', + }, + ], + urls: [], + }, + { + hasChildren: false, + id: '69431027-8867-45s7-a93b-7uibdabfb177', + parent: { id: '69461027-8867-45bf-a93b-72bbdabfb177' }, + noAccess: false, + isTrashed: false, + mediaType: { + id: 'media-type-1-id', + icon: 'icon-bug', + hasListView: false, + }, + values: [ + { + alias: 'myMediaDescription', + value: 'Every day, a rabbit in a military costume greets me at the front door', + }, + ], + variants: [ + { + state: ContentStateModel.PUBLISHED, + publishDate: '2023-02-06T15:31:51.354764', + culture: 'en-us', + segment: null, + name: 'Jane Doe', + createDate: '2023-02-06T15:31:46.876902', + updateDate: '2023-02-06T15:31:51.354764', + }, + ], + urls: [], + }, + { + hasChildren: false, + id: '69431027-8867-45s7-a93b-7uibdabf2147', + parent: { id: '69461027-8867-45bf-a93b-72bbdabfb177' }, + noAccess: false, + isTrashed: false, + mediaType: { + id: 'media-type-1-id', + icon: 'icon-bug', + hasListView: false, + }, + values: [ + { + alias: 'myMediaDescription', + value: 'Every day, a rabbit in a military costume greets me at the front door', + }, + ], + variants: [], + urls: [], + }, + { + hasChildren: false, + id: '694hdj27-8867-45s7-a93b-7uibdabf2147', + parent: { id: '69461027-8867-45bf-a93b-5224dabfb177' }, + noAccess: false, + isTrashed: false, + mediaType: { + id: 'media-type-1-id', + icon: 'icon-bug', + hasListView: false, + }, + values: [ + { + alias: 'myMediaDescription', + value: 'Every day, a rabbit in a military costume greets me at the front door', + }, + ], + variants: [ + { + state: ContentStateModel.PUBLISHED, + publishDate: '2023-02-06T15:31:51.354764', + culture: 'en-us', + segment: null, + name: 'A very nice hat', + createDate: '2023-02-06T15:31:46.876902', + updateDate: '2023-02-06T15:31:51.354764', + }, + ], + urls: [], + }, + { + hasChildren: false, + id: '694hdj27-1237-45s7-a93b-7uibdabfas47', + parent: { id: '69461027-8867-45bf-a93b-5224dabfb177' }, + noAccess: false, + isTrashed: false, + mediaType: { + id: 'media-type-1-id', + icon: 'icon-bug', + hasListView: false, + }, + values: [ + { + alias: 'myMediaDescription', + value: 'Every day, a rabbit in a military costume greets me at the front door', + }, + ], + variants: [ + { + state: ContentStateModel.PUBLISHED, + publishDate: '2023-02-06T15:31:51.354764', + culture: 'en-us', + segment: null, + name: 'Fancy old chair', + createDate: '2023-02-06T15:31:46.876902', + updateDate: '2023-02-06T15:31:51.354764', + }, + ], + urls: [], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts new file mode 100644 index 0000000000..6042aa4c38 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts @@ -0,0 +1,105 @@ +import { UmbMockEntityTreeManager } from '../entity/entity-tree.manager.js'; +import { UmbMockEntityItemManager } from '../entity/entity-item.manager.js'; +import { UmbMockEntityDetailManager } from '../entity/entity-detail.manager.js'; +import { umbMediaTypeMockDb } from '../media-type/media-type.db.js'; +import { UmbEntityMockDbBase } from '../entity/entity-base.js'; +import { UmbEntityRecycleBin } from '../entity/entity-recycle-bin.js'; +import type { UmbMockMediaModel } from './media.data.js'; +import { data } from './media.data.js'; +import { + ContentStateModel, + type CreateMediaRequestModel, + type MediaItemResponseModel, + type MediaResponseModel, + type MediaTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbId } from '@umbraco-cms/backoffice/id'; + +export class UmbMediaMockDB extends UmbEntityMockDbBase { + tree = new UmbMockEntityTreeManager(this, treeItemMapper); + item = new UmbMockEntityItemManager(this, itemMapper); + detail = new UmbMockEntityDetailManager(this, createMockMediaMapper, detailResponseMapper); + recycleBin = new UmbEntityRecycleBin(this.data, treeItemMapper); + + constructor(data: Array) { + super(data); + } +} + +const treeItemMapper = (model: UmbMockMediaModel): Omit => { + const mediaType = umbMediaTypeMockDb.read(model.mediaType.id); + if (!mediaType) throw new Error(`Media type with id ${model.mediaType.id} not found`); + + return { + mediaType: { + hasListView: model.mediaType.hasListView, + icon: model.mediaType.icon, + id: model.mediaType.id, + }, + hasChildren: model.hasChildren, + id: model.id, + isTrashed: model.isTrashed, + noAccess: model.noAccess, + parent: model.parent, + variants: model.variants, + }; +}; + +const createMockMediaMapper = (request: CreateMediaRequestModel): UmbMockMediaModel => { + const mediaType = umbMediaTypeMockDb.read(request.mediaType.id); + if (!mediaType) throw new Error(`Media type with id ${request.mediaType.id} not found`); + + const now = new Date().toString(); + + return { + mediaType: { + id: mediaType.id, + icon: mediaType.icon, + hasListView: false, // TODO: get list from doc type when ready + }, + hasChildren: false, + id: request.id ? request.id : UmbId.new(), + isTrashed: false, + noAccess: false, + parent: request.parent, + values: request.values, + variants: request.variants.map((variantRequest) => { + return { + culture: variantRequest.culture, + segment: variantRequest.segment, + name: variantRequest.name, + createDate: now, + updateDate: now, + state: ContentStateModel.DRAFT, + publishDate: null, + }; + }), + urls: [], + }; +}; + +const detailResponseMapper = (model: UmbMockMediaModel): MediaResponseModel => { + return { + mediaType: model.mediaType, + id: model.id, + isTrashed: model.isTrashed, + urls: model.urls, + values: model.values, + variants: model.variants, + }; +}; + +const itemMapper = (model: UmbMockMediaModel): MediaItemResponseModel => { + return { + mediaType: { + hasListView: model.mediaType.hasListView, + icon: model.mediaType.icon, + id: model.mediaType.id, + }, + id: model.id, + isTrashed: model.isTrashed, + variants: model.variants, + }; +}; + +export const umbMediaMockDb = new UmbMediaMockDB(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/member-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/member-group.data.ts index 6c03e66f93..997c4344b1 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/member-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/member-group.data.ts @@ -1,7 +1,10 @@ import { UmbEntityData } from './entity.data.js'; import { createEntityTreeItem } from './utils.js'; -import { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbMemberGroupDetailModel } from '@umbraco-cms/backoffice/member-group'; +import type { + EntityTreeItemResponseModel, + PagedNamedEntityTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import type { UmbMemberGroupDetailModel } from '@umbraco-cms/backoffice/member-group'; export const data: Array = [ { @@ -23,14 +26,14 @@ class UmbMemberGroupData extends UmbEntityData { super(data); } - getTreeRoot(): PagedEntityTreeItemResponseModel { + getTreeRoot(): PagedNamedEntityTreeItemResponseModel { const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(id: string): PagedEntityTreeItemResponseModel { + getTreeItemChildren(id: string): PagedNamedEntityTreeItemResponseModel { const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/member-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/member-type.data.ts index edb958b636..4297f341a4 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/member-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/member-type.data.ts @@ -1,7 +1,10 @@ import type { MemberTypeDetails } from '../../packages/members/member-types/types.js'; import { UmbData } from './data.js'; import { createEntityTreeItem } from './utils.js'; -import { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { + NamedEntityTreeItemResponseModel, + PagedNamedEntityTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; export const data: Array = [ { @@ -9,7 +12,6 @@ export const data: Array = [ entityType: 'member-type', hasChildren: false, id: 'd59be02f-1df9-4228-aa1e-01917d806cda', - isContainer: false, parentId: null, alias: 'memberType1', properties: [], @@ -23,21 +25,21 @@ class UmbMemberTypeData extends UmbData { super(data); } - getTreeRoot(): PagedEntityTreeItemResponseModel { + getTreeRoot(): PagedNamedEntityTreeItemResponseModel { const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(id: string): PagedEntityTreeItemResponseModel { + getTreeItemChildren(id: string): PagedNamedEntityTreeItemResponseModel { const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItem(ids: Array): Array { + getTreeItem(ids: Array): Array { const items = this.data.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createEntityTreeItem(item)); } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/member.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/member.data.ts index 86f632c551..7f5c05ba3d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/member.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/member.data.ts @@ -3,7 +3,7 @@ import { UmbEntityData } from './entity.data.js'; import { createEntityTreeItem } from './utils.js'; import type { EntityTreeItemResponseModel, - PagedEntityTreeItemResponseModel, + PagedNamedEntityTreeItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; export const data: Array = [ @@ -12,29 +12,24 @@ export const data: Array = [ entityType: 'member', hasChildren: false, id: 'aaa08ccd-4179-464c-b634-6969149dd9f9', - isContainer: false, parentId: null, isFolder: false, }, ]; -// Temp mocked database -// TODO: all properties are optional in the server schema. I don't think this is correct. -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore class UmbMemberData extends UmbEntityData { constructor() { super(data); } - getTreeRoot(): PagedEntityTreeItemResponseModel { + getTreeRoot(): PagedNamedEntityTreeItemResponseModel { const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(id: string): PagedEntityTreeItemResponseModel { + getTreeItemChildren(id: string): PagedNamedEntityTreeItemResponseModel { const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/partial-views.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/partial-view/partial-view.data.ts similarity index 73% rename from src/Umbraco.Web.UI.Client/src/mocks/data/partial-views.data.ts rename to src/Umbraco.Web.UI.Client/src/mocks/data/partial-view/partial-view.data.ts index b747f6df14..e7ba0e972e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/partial-views.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/partial-view/partial-view.data.ts @@ -1,50 +1,48 @@ -import { UmbEntityData } from './entity.data.js'; -import { createFileSystemTreeItem, createTextFileItem } from './utils.js'; -import { - CreateTextFileViewModelBaseModel, +import type { FileSystemTreeItemPresentationModel, - PagedFileSystemTreeItemPresentationModel, + PartialViewItemResponseModel, PartialViewResponseModel, PartialViewSnippetResponseModel, - SnippetItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; -type PartialViewsDataItem = PartialViewResponseModel & FileSystemTreeItemPresentationModel & { id: string }; +export type UmbMockPartialViewModelHack = PartialViewResponseModel & + FileSystemTreeItemPresentationModel & + PartialViewItemResponseModel; -export const treeData: Array = [ +export interface UmbMockPartialViewModel extends Omit {} + +export const data: Array = [ { - id: 'blockgrid', - path: 'blockgrid', - isFolder: true, name: 'blockgrid', - type: 'partial-view', + path: '/blockgrid', + parent: null, + isFolder: true, hasChildren: true, content: '', }, { - id: 'blocklist', - path: 'blocklist', - isFolder: true, name: 'blocklist', - type: 'partial-view', - hasChildren: true, - content: '', - }, - { - id: 'grid', - path: 'grid', + path: '/blocklist', + parent: null, + isFolder: true, + hasChildren: true, + content: '', + }, + { + name: 'grid', + path: '/grid', + parent: null, isFolder: true, - name: 'grid', - type: 'partial-view', hasChildren: true, content: '', }, { - id: 'blockgrid/area.cshtml', - path: 'blockgrid/area.cshtml', - isFolder: false, name: 'area.cshtml', - type: 'partial-view', + path: '/blockgrid/area.cshtml', + parent: { + path: '/blockgrid', + }, + isFolder: false, hasChildren: false, content: `@using Umbraco.Extensions @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @@ -59,20 +57,22 @@ export const treeData: Array = [ `, }, { - id: 'blockgrid/items.cshtml', - path: 'blockgrid/items.cshtml', - isFolder: false, name: 'items.cshtml', - type: 'partial-view', + path: '/blockgrid/items.cshtml', + parent: { + path: '/blockgrid', + }, + isFolder: false, hasChildren: false, content: '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage', }, { - id: 'blocklist/default.cshtml', - path: 'blocklist/default.cshtml', - isFolder: false, name: 'default.cshtml', - type: 'partial-view', + path: '/blocklist/default.cshtml', + parent: { + path: '/blocklist', + }, + isFolder: false, hasChildren: false, content: `@using Umbraco.Extensions @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @@ -88,11 +88,12 @@ export const treeData: Array = [ `, }, { - id: 'grid/embed.cshtm', - path: 'grid/embed.cshtm', - isFolder: false, name: 'embed.cshtml', - type: 'partial-view', + path: '/grid/embed.cshtm', + parent: { + path: '/grid', + }, + isFolder: false, hasChildren: false, content: `@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @@ -108,50 +109,26 @@ export const treeData: Array = [ `, }, { - id: 'grid/default.cshtml', - path: 'grid/default.cshtml', + name: 'default.cshtml', + path: '/grid/default.cshtml', + parent: { + path: '/grid', + }, isFolder: false, - name: 'items.cshtml', - type: 'partial-view', hasChildren: false, content: '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage', }, ]; -class UmbPartialViewsTreeData extends UmbEntityData { - constructor() { - super(treeData); - } - - getTreeRoot(): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.includes('/') === false); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.startsWith(parentPath + '/')); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItem(paths: Array): Array { - const items = this.data.filter((item) => paths.includes(item.path ?? '')); - return items.map((item) => createFileSystemTreeItem(item)); - } -} - -export const umbPartialViewsTreeData = new UmbPartialViewsTreeData(); - export const snippets: Array = [ { name: 'Empty', + id: '37f8786b-0b9b-466f-97b6-e736126fc545', content: '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage', }, { name: 'Breadcrumb', + id: '4ed59952-d0aa-4583-9c3d-9f6b7068dcea', content: `@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @using Umbraco.Cms.Core.Routing @using Umbraco.Extensions @@ -183,6 +160,7 @@ export const snippets: Array = [ }, { name: 'EditProfile', + id: 'a3a41f2d-0891-49f6-b2a1-d75e342fe14e', content: `@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @using Umbraco.Cms.Core.Services @@ -315,67 +293,32 @@ export const snippets: Array = [ }, { name: 'Login', + id: 'd5a4f7fb-ca4f-4452-9071-0795db207103', content: 'login', }, { - name: 'LoginStatus', + name: 'Login Status', + id: '5d0683c8-50b4-4f54-817f-60992ca2a92a', content: 'loginStatus', }, { - name: 'MultinodeTree-picker', + name: 'Multinode Tree-picker', + id: 'c9e264c6-6281-4c94-a7cb-de2fb7c81c04', content: 'MultinodeTree-picker', }, { name: 'Navigation', + id: '1b836d87-969b-4f58-807e-c959a1175c65', content: 'Navigation', }, { - name: 'RegisterMember', + name: 'Register Member', + id: '2f49f869-e382-4e7b-baa4-9da5cfbb134b', content: 'RegisterMember', }, { - name: 'SiteMap', + name: 'Site Map', + id: 'e4a8577a-abf6-4bb1-a942-2a99b10558b4', content: 'SiteMap', }, ]; - -class UmbPartialViewSnippetsData extends UmbEntityData { - constructor() { - super(snippets); - } - - getSnippets(): Array { - return this.data; - } - - getSnippetByName(name: string): SnippetItemResponseModel | undefined { - return this.data.find((item) => item.name === name); - } -} - -class UmbPartialViewsData extends UmbEntityData { - constructor() { - super(treeData); - } - - getPartialView(path: string): PartialViewResponseModel | undefined { - return createTextFileItem(this.data.find((item) => item.path === path)); - } - - insertPartialView(item: CreateTextFileViewModelBaseModel) { - const newItem: PartialViewsDataItem = { - ...item, - path: `${item.parentPath}/${item.name}.cshtml}`, - id: `${item.parentPath}/${item.name}.cshtml}`, - isFolder: false, - hasChildren: false, - type: 'partial-view', - }; - - this.insert(newItem); - return newItem; - } -} - -export const umbPartialViewSnippetsData = new UmbPartialViewSnippetsData(); -export const umbPartialViewsData = new UmbPartialViewsData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/partial-view/partial-view.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/partial-view/partial-view.db.ts new file mode 100644 index 0000000000..cd51c74d3b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/partial-view/partial-view.db.ts @@ -0,0 +1,42 @@ +import { UmbFileSystemMockDbBase } from '../file-system/file-system-base.js'; +import { UmbMockFileSystemFolderManager } from '../file-system/file-system-folder.manager.js'; +import { UmbMockFileSystemItemManager } from '../file-system/file-system-item.manager.js'; +import { UmbMockFileSystemTreeManager } from '../file-system/file-system-tree.manager.js'; +import { UmbMockFileSystemDetailManager } from '../file-system/file-system-detail.manager.js'; +import type { UmbMockPartialViewModel} from './partial-view.data.js'; +import { data, snippets } from './partial-view.data.js'; +import type { + PagedPartialViewSnippetItemResponseModel, + PartialViewSnippetItemResponseModel, + PartialViewSnippetResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +class UmbPartialViewMockDB extends UmbFileSystemMockDbBase { + tree = new UmbMockFileSystemTreeManager(this); + folder = new UmbMockFileSystemFolderManager(this); + item = new UmbMockFileSystemItemManager(this); + file = new UmbMockFileSystemDetailManager(this); + + constructor(data: Array) { + super(data); + } + + getSnippets(): PagedPartialViewSnippetItemResponseModel { + const snippetItems = snippets.map((item) => createSnippetItem(item)); + const total = snippetItems.length; + return { items: snippetItems, total }; + } + + getSnippet(id: string): PartialViewSnippetResponseModel | undefined { + return snippets.find((item) => item.id === id); + } +} + +const createSnippetItem = (item: PartialViewSnippetResponseModel): PartialViewSnippetItemResponseModel => { + return { + name: item.name, + id: item.id, + }; +}; + +export const umbPartialViewMockDB = new UmbPartialViewMockDB(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation-type.data.ts index ffe6093a17..98fb76f45b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation-type.data.ts @@ -1,8 +1,11 @@ import { UmbEntityData } from '../entity.data.js'; import { createEntityTreeItem } from '../utils.js'; -import type { EntityTreeItemResponseModel, RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { + EntityTreeItemResponseModel, + NamedEntityTreeItemResponseModel, + RelationTypeResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; -// TODO: investigate why we don't get an entity type as part of the RelationTypeResponseModel export const data: Array = [ { id: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', @@ -71,43 +74,39 @@ export const data: Array = [ }, ]; -export const treeData: Array = [ +export const treeData: Array = [ { id: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', - isContainer: false, - parentId: null, + parent: null, name: 'Relate Document On Copy', type: 'relation-type', hasChildren: false, }, { id: 'ac68cde6-763f-4231-a751-1101b57defd2', - isContainer: false, - parentId: null, + + parent: null, name: 'Relate Parent Document On Delete', type: 'relation-type', hasChildren: false, }, { id: '6f9b800c-762c-42d4-85d9-bf40a77d689e', - isContainer: false, - parentId: null, + parent: null, name: 'Relate Parent Media Folder On Delete', type: 'relation-type', hasChildren: false, }, { id: 'd421727d-43de-4205-b4c6-037404f309ad', - isContainer: false, - parentId: null, + parent: null, name: 'Related Media', type: 'relation-type', hasChildren: false, }, { id: 'e9a0a28e-2d5b-4229-ac00-66f2df230513', - isContainer: false, - parentId: null, + parent: null, name: 'Related Document', type: 'relation-type', hasChildren: false, @@ -132,7 +131,7 @@ class UmbRelationTypeData extends UmbEntityData { //TODO Can relation types have children? getTreeItemChildren(id: string): Array { - const childItems = this.treeData.filter((item) => item.parentId === id); + const childItems = this.treeData.filter((item) => item.parent?.id === id); return childItems.map((item) => createEntityTreeItem(item)); } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/script/script.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/script/script.data.ts new file mode 100644 index 0000000000..8180bec133 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/script/script.data.ts @@ -0,0 +1,136 @@ +import type { + FileSystemTreeItemPresentationModel, + ScriptItemResponseModel, + ScriptResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export type UmbMockScriptModelHack = ScriptResponseModel & + FileSystemTreeItemPresentationModel & + ScriptItemResponseModel; + +export interface UmbMockScriptModel extends Omit {} + +export const data: Array = [ + { + name: 'some-folder', + path: '/some-folder', + parent: null, + isFolder: true, + hasChildren: true, + content: '', + }, + { + name: 'another-folder', + path: '/another-folder', + parent: null, + isFolder: true, + hasChildren: true, + content: '', + }, + { + name: 'very important folder', + path: '/very important folder', + parent: null, + isFolder: true, + hasChildren: true, + content: '', + }, + { + name: 'ugly script.js', + path: '/some-folder/ugly script.js', + parent: { + path: '/some-folder', + }, + isFolder: false, + hasChildren: false, + content: `function makeid(length) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + var charactersLength = characters.length; + for ( var i = 0; i < length; i++ ) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } + + console.log(makeid(5));`, + }, + { + name: 'nice script.js', + path: '/some-folder/nice script.js', + parent: { + path: '/some-folder', + }, + isFolder: false, + hasChildren: false, + content: `var items = { + "item_1": "1", + "item_2": "2", + "item_3": "3" + } + for (var item in items) { + console.log(items[item]); + }`, + }, + { + name: 'only bugs.js', + path: '/another-folder/only bugs.js', + parent: { + path: '/another-folder', + }, + isFolder: false, + hasChildren: false, + content: `var my_arr = [4, '', 0, 10, 7, '', false, 10]; + + my_arr = my_arr.filter(Boolean); + + console.log(my_arr);`, + }, + { + name: 'no bugs at all.js', + path: '/very important folder/no bugs at all.js', + parent: { + path: '/very important folder', + }, + isFolder: false, + hasChildren: false, + content: `const date_str = "07/20/2021"; + const date = new Date(date_str); + const full_day_name = date.toLocaleDateString('default', { weekday: 'long' }); + // -> to get full day name e.g. Tuesday + + const short_day_name = date.toLocaleDateString('default', { weekday: 'short' }); + console.log(short_day_name); + // -> TO get the short day name e.g. Tue`, + }, + { + name: 'nope.js', + path: '/very important folder/nope.js', + parent: { + path: '/very important folder', + }, + isFolder: false, + hasChildren: false, + content: `// Define an object + const employee = { + "name": "John Deo", + "department": "IT", + "project": "Inventory Manager" + }; + + // Remove a property + delete employee["project"]; + + console.log(employee);`, + }, + { + name: 'file-with-dash.js', + path: '/very important folder/file-with-dash.js', + parent: { + path: '/very important folder', + }, + isFolder: false, + hasChildren: false, + content: `alert('hello file with dash');`, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/script/script.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/script/script.db.ts new file mode 100644 index 0000000000..1ba6005517 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/script/script.db.ts @@ -0,0 +1,20 @@ +import { UmbFileSystemMockDbBase } from '../file-system/file-system-base.js'; +import { UmbMockFileSystemFolderManager } from '../file-system/file-system-folder.manager.js'; +import { UmbMockFileSystemItemManager } from '../file-system/file-system-item.manager.js'; +import { UmbMockFileSystemTreeManager } from '../file-system/file-system-tree.manager.js'; +import { UmbMockFileSystemDetailManager } from '../file-system/file-system-detail.manager.js'; +import type { UmbMockScriptModel} from './script.data.js'; +import { data as scriptData } from './script.data.js'; + +class UmbScriptMockDB extends UmbFileSystemMockDbBase { + tree = new UmbMockFileSystemTreeManager(this); + folder = new UmbMockFileSystemFolderManager(this); + item = new UmbMockFileSystemItemManager(this); + file = new UmbMockFileSystemDetailManager(this); + + constructor(data: Array) { + super(data); + } +} + +export const umbScriptMockDb = new UmbScriptMockDB(scriptData); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts deleted file mode 100644 index e0b88086fd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { UmbData } from './data.js'; -import { createFileItemResponseModelBaseModel, createFileSystemTreeItem, createTextFileItem } from './utils.js'; -import { - CreatePathFolderRequestModel, - CreateTextFileViewModelBaseModel, - FileSystemTreeItemPresentationModel, - PagedFileSystemTreeItemPresentationModel, - ScriptItemResponseModel, - ScriptResponseModel, - UpdateScriptRequestModel, -} from '@umbraco-cms/backoffice/backend-api'; - -type ScriptsDataItem = ScriptResponseModel & FileSystemTreeItemPresentationModel; - -export const data: Array = [ - { - path: 'some-folder', - isFolder: true, - name: 'some-folder', - type: 'script', - hasChildren: true, - content: '', - }, - { - path: 'another-folder', - isFolder: true, - name: 'another-folder', - type: 'script', - hasChildren: true, - content: '', - }, - { - path: 'very important folder', - isFolder: true, - name: 'very important folder', - type: 'script', - hasChildren: true, - content: '', - }, - { - path: 'some-folder/ugly script.js', - isFolder: false, - name: 'ugly script.js', - type: 'script', - hasChildren: false, - content: `function makeid(length) { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - var charactersLength = characters.length; - for ( var i = 0; i < length; i++ ) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } - - console.log(makeid(5));`, - }, - { - path: 'some-folder/nice script.js', - isFolder: false, - name: 'nice script.js', - type: 'script', - hasChildren: false, - content: `var items = { - "item_1": "1", - "item_2": "2", - "item_3": "3" - } - for (var item in items) { - console.log(items[item]); - }`, - }, - { - path: 'another-folder/only bugs.js', - isFolder: false, - name: 'only bugs.js', - type: 'script', - hasChildren: false, - content: `var my_arr = [4, '', 0, 10, 7, '', false, 10]; - - my_arr = my_arr.filter(Boolean); - - console.log(my_arr);`, - }, - { - path: 'very important folder/no bugs at all.js', - isFolder: false, - name: 'no bugs at all.js', - type: 'script', - hasChildren: false, - content: `const date_str = "07/20/2021"; - const date = new Date(date_str); - const full_day_name = date.toLocaleDateString('default', { weekday: 'long' }); - // -> to get full day name e.g. Tuesday - - const short_day_name = date.toLocaleDateString('default', { weekday: 'short' }); - console.log(short_day_name); - // -> TO get the short day name e.g. Tue`, - }, - { - path: 'very important folder/nope.js', - isFolder: false, - name: 'nope.js', - type: 'script', - hasChildren: false, - content: `// Define an object - const employee = { - "name": "John Deo", - "department": "IT", - "project": "Inventory Manager" - }; - - // Remove a property - delete employee["project"]; - - console.log(employee);`, - }, -]; - -class UmbScriptsData extends UmbData { - constructor() { - super(data); - } - - getTreeRoot(): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.includes('/') === false); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.startsWith(parentPath)); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItem(paths: Array): Array { - const items = this.data.filter((item) => paths.includes(item.path ?? '')); - return items.map((item) => createFileSystemTreeItem(item)); - } - - getItem(paths: Array): Array { - const items = this.data.filter((item) => paths.includes(item.path ?? '')); - return items.map((item) => createFileItemResponseModelBaseModel(item)); - } - - getFolder(path: string) { - return data.find((item) => item.isFolder && item.path === path); - } - - postFolder(payload: CreatePathFolderRequestModel) { - const newFolder = { - path: `${payload.parentPath ?? ''}/${payload.name}`, - isFolder: true, - name: payload.name, - type: 'script', - hasChildren: false, - content: '', - }; - return this.insert(newFolder); - } - - deleteFolder(path: string) { - return this.delete([path]); - } - - getScript(path: string): ScriptResponseModel | undefined { - return createTextFileItem(this.data.find((item) => item.path === path)); - } - - insertScript(item: CreateTextFileViewModelBaseModel) { - const newItem: ScriptsDataItem = { - ...item, - path: `${item.parentPath}/${item.name}.js}`, - isFolder: false, - hasChildren: false, - type: 'script', - }; - - this.insert(newItem); - return newItem; - } - - insert(item: ScriptsDataItem) { - const exits = this.data.find((i) => i.path === item.path); - - if (exits) { - throw new Error(`Item with path ${item.path} already exists`); - } - - this.data.push(item); - - return item; - } - - updateData(updateItem: UpdateScriptRequestModel) { - const itemIndex = this.data.findIndex((item) => item.path === updateItem.existingPath); - const item = this.data[itemIndex]; - if (!item) return; - - // TODO: revisit this code, seems like something we can solve smarter/type safer now: - const itemKeys = Object.keys(item); - const newItem = { ...item }; - - for (const [key] of Object.entries(updateItem)) { - if (itemKeys.indexOf(key) !== -1) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - newItem[key] = updateItem[key]; - } - } - // Specific to fileSystem, we need to update path based on name: - const dirName = updateItem.existingPath?.substring(0, updateItem.existingPath.lastIndexOf('/')); - newItem.path = `${dirName}${dirName ? '/' : ''}${updateItem.name}`; - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - this.data[itemIndex] = newItem; - } - - delete(paths: Array) { - const pathsOfItemsToDelete = this.data - .filter((item) => { - if (!item.path) throw new Error('Item has no path'); - return paths.includes(item.path); - }) - .map((item) => item.path); - - this.data = this.data.filter((item) => { - if (!item.path) throw new Error('Item has no path'); - return paths.indexOf(item.path) === -1; - }); - - return pathsOfItemsToDelete; - } -} - -export const umbScriptsData = new UmbScriptsData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/static-file.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/static-file.data.ts deleted file mode 100644 index 1c14154a0e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/static-file.data.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { UmbData } from './data.js'; -import { createFileItemResponseModelBaseModel, createFileSystemTreeItem } from './utils.js'; -import { - FileSystemTreeItemPresentationModel, - PagedFileSystemTreeItemPresentationModel, - ScriptItemResponseModel, - StaticFileItemResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; - -type StaticFileItem = StaticFileItemResponseModel & FileSystemTreeItemPresentationModel & { icon?: string }; - -export const data: Array = [ - { - path: 'some-file.js', - name: 'some-file', - icon: 'icon-document', - type: 'static-file', - hasChildren: false, - isFolder: false, - }, - { - path: 'another-file.js', - name: 'another-file', - icon: 'icon-document', - type: 'static-file', - hasChildren: false, - isFolder: false, - }, -]; - -class UmbStaticFileData extends UmbData { - constructor() { - super(data); - } - - getTreeRoot(): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.includes('/') === false); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.startsWith(parentPath)); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItem(paths: Array): Array { - const items = this.data.filter((item) => paths.includes(item.path ?? '')); - return items.map((item) => createFileSystemTreeItem(item)); - } - - getItem(paths: Array): Array { - const items = this.data.filter((item) => paths.includes(item.path ?? '')); - return items.map((item) => createFileItemResponseModelBaseModel(item)); - } -} - -export const umbStaticFileData = new UmbStaticFileData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/static-file/static-file.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/static-file/static-file.data.ts new file mode 100644 index 0000000000..d94cabbbcc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/static-file/static-file.data.ts @@ -0,0 +1,37 @@ +import type { FileSystemTreeItemPresentationModel, StaticFileItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export type UmbMockStaticFileModelHack = StaticFileItemResponseModel & FileSystemTreeItemPresentationModel; +export interface UmbMockStaticFileModel extends Omit {} + +export const data: Array = [ + { + path: '/some-file.js', + parent: null, + name: 'some-file.js', + hasChildren: false, + isFolder: false, + }, + { + path: '/another-file.js', + parent: null, + name: 'another-file.js', + hasChildren: false, + isFolder: false, + }, + { + path: '/Folder 1', + parent: null, + name: 'Folder 1', + hasChildren: true, + isFolder: true, + }, + { + path: '/Folder 1/File in Folder 1.js', + parent: { + path: '/Folder 1', + }, + name: 'File in Folder 1.js', + hasChildren: false, + isFolder: false, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/static-file/static-file.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/static-file/static-file.db.ts new file mode 100644 index 0000000000..65896cf146 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/static-file/static-file.db.ts @@ -0,0 +1,16 @@ +import { UmbFileSystemMockDbBase } from '../file-system/file-system-base.js'; +import { UmbMockFileSystemItemManager } from '../file-system/file-system-item.manager.js'; +import { UmbMockFileSystemTreeManager } from '../file-system/file-system-tree.manager.js'; +import type { UmbMockStaticFileModel} from './static-file.data.js'; +import { data as staticFileData } from './static-file.data.js'; + +class UmbStaticFileMockDB extends UmbFileSystemMockDbBase { + tree = new UmbMockFileSystemTreeManager(this); + item = new UmbMockFileSystemItemManager(this); + + constructor(data: Array) { + super(data); + } +} + +export const umbStaticFileMockDb = new UmbStaticFileMockDB(staticFileData); 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 deleted file mode 100644 index 5916118028..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet.data.ts +++ /dev/null @@ -1,299 +0,0 @@ -import { UmbData } from './data.js'; -import { createFileSystemTreeItem, createFileItemResponseModelBaseModel, createTextFileItem } from './utils.js'; -import { - CreateTextFileViewModelBaseModel, - ExtractRichTextStylesheetRulesRequestModel, - ExtractRichTextStylesheetRulesResponseModel, - FileSystemTreeItemPresentationModel, - InterpolateRichTextStylesheetRequestModel, - PagedFileSystemTreeItemPresentationModel, - PagedStylesheetOverviewResponseModel, - StylesheetItemResponseModel, - StylesheetResponseModel, - UpdateStylesheetRequestModel, -} from '@umbraco-cms/backoffice/backend-api'; - -//prettier-ignore -// eslint-disable-next-line no-useless-escape - -type StylesheetDBItem = StylesheetResponseModel & FileSystemTreeItemPresentationModel & { icon?: string }; - -export const data: Array = [ - { - path: 'Stylesheet File 1.css', - icon: 'style', - isFolder: false, - name: 'Stylesheet File 1.css', - type: 'stylesheet', - hasChildren: false, - content: ` - /** Stylesheet 1 */ - - h1 { - color: blue; -} - -/**umb_name:bjjh*/ -h1 { - color: blue; -} - -/**umb_name:comeone*/ -h1 { - color: blue; -} - -/**umb_name:lol*/ -h1 { - color: blue; -}`, - }, - { - path: 'Stylesheet File 2.css', - isFolder: false, - icon: 'style', - name: 'Stylesheet File 2.css', - type: 'stylesheet', - hasChildren: false, - content: ` - /** Stylesheet 2 */ -h1 { - color: green; -} - -/**umb_name:HELLO*/ -h1 { - color: green; -} - -/**umb_name:SOMETHING*/ -h1 { - color: green; -} - -/**umb_name:NIOCE*/ -h1 { - color: green; -}`, - }, - { - path: 'Folder 1', - name: 'Folder 1', - isFolder: true, - icon: 'folder', - type: 'stylesheet', - hasChildren: true, - content: '', - }, - { - path: 'Folder 1/Stylesheet File 3.css', - name: 'Stylesheet File 3.css', - type: 'stylesheet', - hasChildren: false, - isFolder: false, - content: `h1 { - color: pink; -} - -/**umb_name:ONE*/ -h1 { - color: pink; -} - -/**umb_name:TWO*/ -h1 { - color: pink; -} - -/**umb_name:THREE*/ -h1 { - color: pink; -}`, - }, -]; - -// Temp mocked database -// TODO: all properties are optional in the server schema. I don't think this is correct. -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -class UmbStylesheetData extends UmbData { - constructor() { - super(data); - } - - getTreeRoot(): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.includes('/') === false); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.startsWith(parentPath + '/')); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItem(paths: Array): Array { - const items = this.data.filter((item) => paths.includes(item.path ?? '')); - return items.map((item) => createFileSystemTreeItem(item)); - } - - getItems(paths: Array): Array { - const items = this.data.filter((item) => paths.includes(item.path ?? '')); - return items.map((item) => createFileItemResponseModelBaseModel(item)); - } - - getStylesheet(path: string): StylesheetResponseModel | undefined { - return createTextFileItem(this.data.find((item) => item.path === path)); - } - - getAllStylesheets(): PagedStylesheetOverviewResponseModel { - return { - items: this.data.map((item) => createTextFileItem(item)), - total: this.data.map((item) => !item.isFolder).length, - }; - } - - getFolder(path: string): StylesheetDBItem | undefined { - return this.data.find((item) => item.path === path && item.isFolder === true); - } - - getRules(path: string): ExtractRichTextStylesheetRulesResponseModel { - const regex = /\*\*\s*umb_name:\s*(?[^*\r\n]*?)\s*\*\/\s*(?[^,{]*?)\s*{\s*(?.*?)\s*}/gis; - const item = this.data.find((item) => item.path === path); - if (!item) throw Error('item not found'); - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - //@ts-ignore - // eslint-disable-next-line no-unsafe-optional-chaining - const rules = [...item.content?.matchAll(regex)].map((match) => match.groups) as Array; - return { rules }; - } - - async extractRules({ requestBody }: { requestBody?: ExtractRichTextStylesheetRulesRequestModel }) { - const regex = /\*\*\s*umb_name:\s*(?[^*\r\n]*?)\s*\*\/\s*(?[^,{]*?)\s*{\s*(?.*?)\s*}/gis; - - if (!requestBody) { - throw Error('No request body'); - } - const { content } = await requestBody; - if (!content) return { rules: [] }; - const rules = [...content.matchAll(regex)].map((match) => match.groups); - return { rules }; - } - - interpolateRules({ requestBody }: { requestBody?: InterpolateRichTextStylesheetRequestModel }) { - const regex = /\/\*\*\s*umb_name:\s*(?[^*\r\n]*?)\s*\*\/\s*(?[^,{]*?)\s*{\s*(?.*?)\s*}/gis; - if (!requestBody) { - throw Error('No request body'); - } - const { content, rules } = requestBody; - if (!content && !rules) return { content: '' }; - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - //@ts-ignore - const cleanedContent = content?.replaceAll(regex, ''); - - const newContent = `${cleanedContent.replace(/[\r\n]+$/, '')} - -${rules - ?.map( - (rule) => - `/**umb_name:${rule.name}*/ -${rule.selector} { - ${rule.styles} -} - -`, - ) - .join('')}`; - - return { content: newContent }; - } - - insertFolder(item: CreateTextFileViewModelBaseModel) { - const newItem: StylesheetDBItem = { - ...item, - path: `${item.parentPath}/${item.name}`, - isFolder: true, - hasChildren: false, - type: 'stylesheet', - icon: 'folder', - }; - - this.insert(newItem); - return newItem; - } - - insertStyleSheet(item: CreateTextFileViewModelBaseModel) { - const parentPath = item.parentPath ? `${item.parentPath}/` : ''; - const newItem: StylesheetDBItem = { - ...item, - path: `${parentPath}${item.name}`, - isFolder: false, - hasChildren: false, - type: 'stylesheet', - icon: 'style', - }; - - this.insert(newItem); - return newItem; - } - - insert(item: StylesheetDBItem) { - const exits = this.data.find((i) => i.path === item.path); - - if (exits) { - throw new Error(`Item with path ${item.path} already exists`); - } - - this.data.push(item); - - return item; - } - - updateData(updateItem: UpdateStylesheetRequestModel) { - const itemIndex = this.data.findIndex((item) => item.path === updateItem.existingPath); - const item = this.data[itemIndex]; - if (!item) return; - - // TODO: revisit this code, seems like something we can solve smarter/type safer now: - const itemKeys = Object.keys(item); - const newItem = { ...item }; - - for (const [key] of Object.entries(updateItem)) { - if (itemKeys.indexOf(key) !== -1) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - newItem[key] = updateItem[key]; - } - } - // Specific to fileSystem, we need to update path based on name: - const dirName = updateItem.existingPath?.substring(0, updateItem.existingPath.lastIndexOf('/')); - newItem.path = `${dirName}${dirName ? '/' : ''}${updateItem.name}`; - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - this.data[itemIndex] = newItem; - } - - delete(paths: Array) { - const deletedPaths = this.data - .filter((item) => { - if (!item.path) throw new Error('Item has no path'); - paths.includes(item.path); - }) - .map((item) => item.path); - - this.data = this.data.filter((item) => { - if (!item.path) throw new Error('Item has no path'); - paths.indexOf(item.path) === -1; - }); - - return deletedPaths; - } -} - -export const umbStylesheetData = new UmbStylesheetData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet/stylesheet.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet/stylesheet.data.ts new file mode 100644 index 0000000000..8a99136b1c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet/stylesheet.data.ts @@ -0,0 +1,104 @@ +import type { + FileSystemTreeItemPresentationModel, + StylesheetItemResponseModel, + StylesheetResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export type UmbMockStylesheetModelHack = StylesheetResponseModel & + FileSystemTreeItemPresentationModel & + StylesheetItemResponseModel; + +export interface UmbMockStylesheetModel extends Omit {} + +export const data: Array = [ + { + name: 'Stylesheet File 1.css', + path: '/Stylesheet File 1.css', + parent: null, + isFolder: false, + hasChildren: false, + content: ` + /** Stylesheet 1 */ + + h1 { + color: blue; +} + +/**umb_name:bjjh*/ +h1 { + color: blue; +} + +/**umb_name:comeone*/ +h1 { + color: blue; +} + +/**umb_name:lol*/ +h1 { + color: blue; +}`, + }, + { + name: 'Stylesheet File 2.css', + path: '/Stylesheet File 2.css', + parent: null, + isFolder: false, + hasChildren: false, + content: ` + /** Stylesheet 2 */ +h1 { + color: green; +} + +/**umb_name:HELLO*/ +h1 { + color: green; +} + +/**umb_name:SOMETHING*/ +h1 { + color: green; +} + +/**umb_name:NIOCE*/ +h1 { + color: green; +}`, + }, + { + name: 'Folder 1', + path: '/Folder 1', + parent: null, + isFolder: true, + hasChildren: true, + content: '', + }, + { + name: 'Stylesheet File 3.css', + path: '/Folder 1/Stylesheet File 3.css', + parent: { + path: '/Folder 1', + }, + hasChildren: false, + isFolder: false, + content: `h1 { + color: pink; +} + +/**umb_name:ONE*/ +h1 { + color: pink; +} + +/**umb_name:TWO*/ +h1 { + color: pink; +} + +/**umb_name:THREE*/ +h1 { + color: pink; +}`, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet/stylesheet.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet/stylesheet.db.ts new file mode 100644 index 0000000000..4b5ed888e1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/stylesheet/stylesheet.db.ts @@ -0,0 +1,20 @@ +import { UmbFileSystemMockDbBase } from '../file-system/file-system-base.js'; +import { UmbMockFileSystemDetailManager } from '../file-system/file-system-detail.manager.js'; +import { UmbMockFileSystemFolderManager } from '../file-system/file-system-folder.manager.js'; +import { UmbMockFileSystemItemManager } from '../file-system/file-system-item.manager.js'; +import { UmbMockFileSystemTreeManager } from '../file-system/file-system-tree.manager.js'; +import type { UmbMockStylesheetModel} from './stylesheet.data.js'; +import { data } from './stylesheet.data.js'; + +class UmbStylesheetMockDb extends UmbFileSystemMockDbBase { + tree = new UmbMockFileSystemTreeManager(this); + item = new UmbMockFileSystemItemManager(this); + folder = new UmbMockFileSystemFolderManager(this); + file = new UmbMockFileSystemDetailManager(this); + + constructor(data: Array) { + super(data); + } +} + +export const umbStylesheetMockDb = new UmbStylesheetMockDb(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/template.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/template.data.ts index d3c1592992..68cf9daf25 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/template.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/template.data.ts @@ -1,18 +1,17 @@ import { UmbEntityData } from './entity.data.js'; import { createEntityTreeItem } from './utils.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; -import { +import type { EntityTreeItemResponseModel, - PagedEntityTreeItemResponseModel, TemplateResponseModel, TemplateScaffoldResponseModel, CreateTemplateRequestModel, TemplateItemResponseModel, TemplateQuerySettingsResponseModel, - TemplateQueryPropertyTypeModel, - OperatorModel, TemplateQueryResultResponseModel, + PagedNamedEntityTreeItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; +import { TemplateQueryPropertyTypeModel, OperatorModel } from '@umbraco-cms/backoffice/backend-api'; type UmbMockTemplateModel = TemplateResponseModel & EntityTreeItemResponseModel; @@ -35,10 +34,9 @@ const createTemplateItem = (dbItem: UmbMockTemplateModel): TemplateItemResponseM export const data: Array = [ { id: '2bf464b6-3aca-4388-b043-4eb439cc2643', - isContainer: false, - parentId: null, + parent: null, name: 'Doc 1', - type: 'template', + type: 'templa }te', hasChildren: false, alias: 'Doc1', content: `@using Umbraco.Extensions @@ -57,10 +55,9 @@ export const data: Array = [ }, { id: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', - isContainer: false, - parentId: null, + parent: null, name: 'Test', - type: 'template', + type: 'templat }e', hasChildren: true, alias: 'Test', content: @@ -68,8 +65,7 @@ export const data: Array = [ }, { id: '9a84c0b3-03b4-4dd4-84ac-706740ac0f72', - isContainer: false, - parentId: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', + parent: { id: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71' }, masterTemplateId: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', name: 'Child', type: 'template', @@ -80,8 +76,7 @@ export const data: Array = [ }, { id: '9a84c0b3-03b4-4dd4-84ac-706740acwerer0f72', - isContainer: false, - parentId: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', + parent: { id: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71' }, name: 'Has Master Template', masterTemplateId: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', type: 'template', @@ -232,15 +227,15 @@ class UmbTemplateData extends UmbEntityData { return template; } - getTreeRoot(): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentId === null); + getTreeRoot(): PagedNamedEntityTreeItemResponseModel { + const items = this.data.filter((item) => item.parent?.id === null); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(id: string): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentId === id); + getTreeItemChildren(id: string): PagedNamedEntityTreeItemResponseModel { + const items = this.data.filter((item) => item.parent?.id === id); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/tracked-reference.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/tracked-reference.data.ts index 9ece80fa23..df1df04c00 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/tracked-reference.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/tracked-reference.data.ts @@ -1,4 +1,4 @@ -import { RelationItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { RelationItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; export const items: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index 135bc8ff95..c81be4490d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -1,4 +1,4 @@ -import { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_USER_PERMISSION_DOCUMENT_CREATE, UMB_USER_PERMISSION_DOCUMENT_DELETE, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index 4c62cc68b9..d61d0bd916 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -1,6 +1,6 @@ import { UmbEntityData } from '../entity.data.js'; import { data } from './user-group.data.js'; -import { UserGroupItemResponseModel, UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupItemResponseModel, UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; const createUserGroupItem = (item: UserGroupResponseModel): UserGroupItemResponseModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts index 55eb538677..41ff5349f0 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts @@ -1,4 +1,5 @@ -import { UserResponseModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UserResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; export const data: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index dad74c3e70..e90fa2ce36 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -3,8 +3,8 @@ import { umbUserGroupData } from '../user-group/user-group.db.js'; import { arrayFilter, stringFilter, queryFilter } from '../utils.js'; import { data } from './user.data.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; -import { UmbCurrentUser } from '@umbraco-cms/backoffice/current-user'; -import { +import type { UmbCurrentUser } from '@umbraco-cms/backoffice/current-user'; +import type { CreateUserRequestModel, CreateUserResponseModel, InviteUserRequestModel, @@ -12,8 +12,8 @@ import { UpdateUserGroupsOnUserRequestModel, UserItemResponseModel, UserResponseModel, - UserStateModel, } from '@umbraco-cms/backoffice/backend-api'; +import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; const createUserItem = (item: UserResponseModel): UserItemResponseModel => { return { @@ -89,7 +89,7 @@ class UmbUserData extends UmbEntityData { /** * Get current user - * @return {*} {UmbLoggedInUser} + * @return {*} {UmbCurrentUser} * @memberof UmbUserData */ getCurrentUser(): UmbCurrentUser { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts index 210fa01636..3e46447f94 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts @@ -1,102 +1,36 @@ import type { - ContentTreeItemResponseModel, - DocumentTreeItemResponseModel, - EntityTreeItemResponseModel, FolderTreeItemResponseModel, FileSystemTreeItemPresentationModel, - DocumentResponseModel, - TextFileResponseModelBaseModel, - FileItemResponseModelBaseModel, - MediaTypeResponseModel, - MediaTypeTreeItemResponseModel, - MediaTreeItemResponseModel, + NamedEntityTreeItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbMediaDetailModel } from '@umbraco-cms/backoffice/media'; -export const createEntityTreeItem = (item: any): EntityTreeItemResponseModel => { +export const createEntityTreeItem = (item: any): NamedEntityTreeItemResponseModel => { return { name: item.name, type: item.type, hasChildren: item.hasChildren, id: item.id, - isContainer: item.isContainer, - parentId: item.parentId ?? null, + parent: item.parent, }; }; -export const createFolderTreeItem = (item: any): FolderTreeItemResponseModel => { +export const folderTreeItemMapper = (item: any): FolderTreeItemResponseModel => { return { ...createEntityTreeItem(item), isFolder: item.isFolder, }; }; -export const createContentTreeItem = (item: any): ContentTreeItemResponseModel => { - // TODO: There we have to adapt to variants as part of the tree model: +export const createFileSystemTreeItem = (item: any): Omit => { return { - ...createEntityTreeItem(item), - noAccess: item.noAccess, - isTrashed: item.isTrashed, - }; -}; - -export const createDocumentTreeItem = (item: DocumentResponseModel): DocumentTreeItemResponseModel => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - return { - ...createContentTreeItem(item), - type: 'document', - icon: 'document', // TODO: Should get this from document type... - name: item.variants?.[0].name ?? '', - noAccess: false, - isProtected: false, - isPublished: false, - isEdited: false, - isTrashed: false, - hasChildren: false, - isContainer: false, - }; -}; - -export const createMediaTreeItem = (item: UmbMediaDetailModel): MediaTreeItemResponseModel => { - return { - ...createContentTreeItem(item), - type: 'media', - icon: 'media', // TODO: Should get this from media type... - }; -}; - -export const createMediaTypeTreeItem = (item: MediaTypeResponseModel): MediaTypeTreeItemResponseModel => { - return { - ...createEntityTreeItem(item), - type: 'media-type', - isFolder: false, - icon: item.icon, - }; -}; - -export const createFileSystemTreeItem = (item: any): FileSystemTreeItemPresentationModel => { - return { - name: item.name, - type: item.type, - hasChildren: item.hasChildren ?? false, path: item.path, + parent: item.parent ?? null, + name: item.name, + hasChildren: item.hasChildren ?? false, isFolder: item.isFolder ?? false, }; }; -export const createTextFileItem = (item: any): TextFileResponseModelBaseModel => ({ - path: item.path, - name: item.name, - content: item.content, -}); - -export const createFileItemResponseModelBaseModel = (item: any): FileItemResponseModelBaseModel => ({ - path: item.path, - name: item.name, - icon: item.icon, -}); - export const arrayFilter = (filterBy: Array, value?: Array): boolean => { // if a filter is not set, return all items if (!filterBy) { 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 de0db89e66..037dfef4b7 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts @@ -20,7 +20,7 @@ import { handlers as trackedReferenceHandlers } from './handlers/tracked-referen export const handlers = [ serverHandlers.serverRunningHandler, - serverHandlers.serverVersionHandler, + serverHandlers.serverInformationHandler, manifestsHandlers.manifestEmptyHandler, ...auditLogHandlers, ...installHandlers, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/audit-log.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/audit-log.handlers.ts index 18c6d49123..0cd0695c46 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/audit-log.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/audit-log.handlers.ts @@ -1,7 +1,7 @@ import { logs, logsWithUser } from '../data/audit-log.data.js'; const { rest } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { +import type { PagedAuditLogResponseModel, PagedAuditLogWithUsernameResponseModel, } from '@umbraco-cms/backoffice/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/copy.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/copy.handlers.ts index ff9898442c..1c6c660a7d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/copy.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/copy.handlers.ts @@ -1,18 +1,20 @@ const { rest } = window.MockServiceWorker; -import { umbDataTypeData } from '../../data/data-type.data.js'; +import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; +import type { CopyDataTypeRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const copyHandlers = [ rest.post(umbracoPath(`${UMB_SLUG}/:id/copy`), async (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; + if (!id) return res(ctx.status(400, 'no id found')); - const data = await req.json(); - if (!data) return; + const requestBody = (await req.json()) as CopyDataTypeRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + if (!requestBody.targetId) return res(ctx.status(400, 'no targetId found')); - const newIds = umbDataTypeData.copy([id], data.targetId); + const newIds = umbDataTypeMockDb.tree.copy([id], requestBody.targetId); - return res(ctx.status(200), ctx.set({ Location: newIds[0] })); + return res(ctx.status(201), ctx.set({ Location: newIds[0] })); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/detail.handlers.ts index e2e1f86552..3ae09b4602 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/detail.handlers.ts @@ -1,44 +1,45 @@ const { rest } = window.MockServiceWorker; -import { umbDataTypeData } from '../../data/data-type.data.js'; +import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; +import type { CreateDataTypeRequestModel, UpdateDataTypeRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + const requestBody = (await req.json()) as CreateDataTypeRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); - umbDataTypeData.insert(data); + const id = umbDataTypeMockDb.detail.create(requestBody); - return res(ctx.status(200)); + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); }), rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - - const dataType = umbDataTypeData.getById(id); - - return res(ctx.status(200), ctx.json(dataType)); + if (!id) return res(ctx.status(400)); + const response = umbDataTypeMockDb.detail.read(id); + return res(ctx.status(200), ctx.json(response)); }), rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - - umbDataTypeData.save(id, data); - + if (!id) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateDataTypeRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbDataTypeMockDb.detail.update(id, requestBody); return res(ctx.status(200)); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { + rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - - umbDataTypeData.delete([id]); - + if (!id) return res(ctx.status(400)); + umbDataTypeMockDb.detail.delete(id); return res(ctx.status(200)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/folder.handlers.ts index 468b22c955..608446abab 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/folder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/folder.handlers.ts @@ -1,55 +1,44 @@ const { rest } = window.MockServiceWorker; -import { umbDataTypeData } from '../../data/data-type.data.js'; +import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; export const folderHandlers = [ rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + const requestBody = await req.json(); + if (!requestBody) return res(ctx.status(400, 'no body found')); - umbDataTypeData.createFolder(data); + const id = umbDataTypeMockDb.folder.create(requestBody); - return res(ctx.status(200)); + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); }), rest.get(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - - const dataType = umbDataTypeData.getById(id); - - return res(ctx.status(200), ctx.json(dataType)); + if (!id) return res(ctx.status(400)); + const response = umbDataTypeMockDb.folder.read(id); + return res(ctx.status(200), ctx.json(response)); }), rest.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - - umbDataTypeData.save(id, data); - + if (!id) return res(ctx.status(400, 'no id found')); + const requestBody = await req.json(); + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbDataTypeMockDb.folder.update(id, requestBody); return res(ctx.status(200)); }), - rest.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), async (req, res, ctx) => { + rest.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - - try { - umbDataTypeData.deleteFolder(id); - return res(ctx.status(200)); - } catch (error) { - return res( - ctx.status(404), - ctx.json({ - status: 404, - type: 'error', - detail: 'Not Found', - }), - ); - } + if (!id) return res(ctx.status(400)); + umbDataTypeMockDb.folder.delete(id); + return res(ctx.status(200)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/item.handlers.ts index 9b69739d37..92b9f93a08 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/item.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbDataTypeData } from '../../data/data-type.data.js'; +import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -7,7 +7,7 @@ export const itemHandlers = [ rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { const ids = req.url.searchParams.getAll('id'); if (!ids) return; - const items = umbDataTypeData.getItems(ids); + const items = umbDataTypeMockDb.item.getItems(ids); return res(ctx.status(200), ctx.json(items)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts index 24d6de9390..616fc24c04 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts @@ -1,18 +1,19 @@ const { rest } = window.MockServiceWorker; -import { umbDataTypeData } from '../../data/data-type.data.js'; +import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; +import type { MoveDataTypeRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const moveHandlers = [ rest.post(umbracoPath(`${UMB_SLUG}/:id/move`), async (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; + if (!id) return res(ctx.status(400)); - const data = await req.json(); - if (!data) return; - - umbDataTypeData.move([id], data.targetId); + const requestBody = (await req.json()) as MoveDataTypeRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + if (!requestBody.targetId) return res(ctx.status(400, 'no targetId found')); + umbDataTypeMockDb.tree.move([id], requestBody.targetId); return res(ctx.status(200)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts index 63ba0ca1c4..6b40a709ad 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts @@ -1,29 +1,18 @@ const { rest } = window.MockServiceWorker; -import { umbDataTypeData } from '../../data/data-type.data.js'; +import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const rootItems = umbDataTypeData.getTreeRoot(); - const response = { - total: rootItems.length, - items: rootItems, - }; + const response = umbDataTypeMockDb.tree.getRoot(); return res(ctx.status(200), ctx.json(response)); }), rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { const parentId = req.url.searchParams.get('parentId'); if (!parentId) return; - - const children = umbDataTypeData.getTreeItemChildren(parentId); - - const response = { - total: children.length, - items: children, - }; - + const response = umbDataTypeMockDb.tree.getChildrenOf(parentId); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary.handlers.ts index ea6882b2ac..31aefe8d32 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary.handlers.ts @@ -1,7 +1,7 @@ const { rest } = window.MockServiceWorker; import { umbDictionaryData } from '../data/dictionary.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { +import type { ImportDictionaryRequestModel, DictionaryOverviewResponseModel, DictionaryItemResponseModel, @@ -15,12 +15,11 @@ const uploadResponse: ImportDictionaryRequestModel = { /// TODO: get correct type const importResponse: DictionaryItemResponseModel & EntityTreeItemResponseModel = { - parentId: null, + parent: null, name: 'Uploaded dictionary', id: 'b7e7d0ab-53ba-485d-dddd-12537f9925cb', hasChildren: false, type: 'dictionary-item', - isContainer: false, translations: [ { isoCode: 'en', @@ -185,12 +184,15 @@ export const handlers = [ if (!file || !importResponse.id) return; - importResponse.parentId = req.url.searchParams.get('parentId') ?? null; + const parentId = req.url.searchParams.get('parentId') ?? null; + importResponse.parent = parentId ? { id: parentId } : null; umbDictionaryData.save(importResponse.id, importResponse); // build the path to the new item => reflects the expected server response const path = ['-1']; - if (importResponse.parentId) path.push(importResponse.parentId); + if (importResponse.parent?.id) { + path.push(importResponse.parent.id); + } path.push(importResponse.id); 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 index fad4b1a5bf..6eee0e368a 100644 --- 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 @@ -1,36 +1,45 @@ const { rest } = window.MockServiceWorker; -import { umbDocumentTypeData } from '../../data/document-type/document-type.db.js'; +import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; import { UMB_SLUG } from './slug.js'; +import type { CreateMediaTypeRequestModel, UpdateMediaTypeRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const handlers = [ - rest.get(umbracoPath(`${UMB_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)); +export const detailHandlers = [ + rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateMediaTypeRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const id = umbDocumentTypeMockDb.detail.create(requestBody); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { + rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - umbDocumentTypeData.delete([id]); - return res(ctx.status(200)); + if (!id) return res(ctx.status(400)); + const response = umbDocumentTypeMockDb.detail.read(id); + return res(ctx.status(200), ctx.json(response)); }), rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - umbDocumentTypeData.save(id, data); + if (!id) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateMediaTypeRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbDocumentTypeMockDb.detail.update(id, requestBody); return res(ctx.status(200)); }), - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - umbDocumentTypeData.insert(data); + rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + umbDocumentTypeMockDb.detail.delete(id); return res(ctx.status(200)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/folder.handlers.ts new file mode 100644 index 0000000000..565890e0b3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/folder.handlers.ts @@ -0,0 +1,44 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const folderHandlers = [ + rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { + const requestBody = await req.json(); + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const id = umbDocumentTypeMockDb.folder.create(requestBody); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const response = umbDocumentTypeMockDb.folder.read(id); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400, 'no id found')); + const requestBody = await req.json(); + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbDocumentTypeMockDb.folder.update(id, requestBody); + return res(ctx.status(200)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + umbDocumentTypeMockDb.folder.delete(id); + 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 index e691416e8c..35a0b233f7 100644 --- 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 @@ -1,5 +1,7 @@ -import { handlers as treeHandlers } from './tree.handlers.js'; -import { handlers as detailHandlers } from './detail.handlers.js'; -import { handlers as itemHandlers } from './item.handlers.js'; +import { treeHandlers } from './tree.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; +import { itemHandlers } from './item.handlers.js'; +import { folderHandlers } from './folder.handlers.js'; +import { structureHandlers } from './structure.handlers.js'; -export const handlers = [...treeHandlers, ...itemHandlers, ...detailHandlers]; +export const handlers = [...treeHandlers, ...itemHandlers, ...folderHandlers, ...structureHandlers, ...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 index fb5a49bf36..81f9aa24f3 100644 --- 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 @@ -1,13 +1,13 @@ const { rest } = window.MockServiceWorker; -import { umbDocumentTypeData } from '../../data/document-type/document-type.db.js'; +import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const handlers = [ +export const itemHandlers = [ rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { const ids = req.url.searchParams.getAll('id'); if (!ids) return; - const items = umbDocumentTypeData.getItems(ids); + const items = umbDocumentTypeMockDb.item.getItems(ids); return res(ctx.status(200), ctx.json(items)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/structure.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/structure.handlers.ts new file mode 100644 index 0000000000..3d16440c73 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/structure.handlers.ts @@ -0,0 +1,18 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const structureHandlers = [ + rest.get(umbracoPath(`${UMB_SLUG}/:id/allowed-children`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const response = umbDocumentTypeMockDb.getAllowedChildren(id); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/allowed-at-root`), (req, res, ctx) => { + const response = umbDocumentTypeMockDb.getAllowedAtRoot(); + return res(ctx.status(200), ctx.json(response)); + }), +]; 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 index f6e2efacf8..79b722f63c 100644 --- 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 @@ -1,29 +1,18 @@ const { rest } = window.MockServiceWorker; -import { umbDocumentTypeData } from '../../data/document-type/document-type.db.js'; +import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const handlers = [ +export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const rootItems = umbDocumentTypeData.getTreeRoot(); - const response = { - total: rootItems.length, - items: rootItems, - }; + const response = umbDocumentTypeMockDb.tree.getRoot(); return res(ctx.status(200), ctx.json(response)); }), rest.get(umbracoPath(`/tree${UMB_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, - }; - + const response = umbDocumentTypeMockDb.tree.getChildrenOf(parentId); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/detail.handlers.ts new file mode 100644 index 0000000000..6bfe569fe0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/detail.handlers.ts @@ -0,0 +1,45 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentMockDb } from '../../data/document/document.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { CreateDocumentRequestModel, UpdateDocumentRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const detailHandlers = [ + rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateDocumentRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const id = umbDocumentMockDb.detail.create(requestBody); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const response = umbDocumentMockDb.detail.read(id); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateDocumentRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbDocumentMockDb.detail.update(id, requestBody); + return res(ctx.status(200)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + umbDocumentMockDb.detail.delete(id); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/document.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/document.handlers.ts deleted file mode 100644 index 6db43aa751..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/document.handlers.ts +++ /dev/null @@ -1,72 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { umbDocumentData } from '../../data/document.data.js'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; - -// TODO: add schema -export const handlers = [ - rest.get(umbracoPath('/document/root/allowed-document-types'), (req, res, ctx) => { - const response = umbDocumentData.getAllowedDocumentTypesAtRoot(); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.put(umbracoPath('/document/:id/move-to-recycle-bin'), async (req, res, ctx) => { - const id = req.params.id as string; - umbDocumentData.trash([id]); - return res(ctx.status(200)); - }), - - rest.put(umbracoPath('/document/:id/publish'), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - umbDocumentData.publish(id, data); - return res(ctx.status(200)); - }), - - rest.put(umbracoPath('/document/:id/unpublish'), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - umbDocumentData.unpublish(id, data); - return res(ctx.status(200)); - }), - - rest.get(umbracoPath('/document/:id/allowed-document-types'), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const response = umbDocumentData.getDocumentByIdAllowedDocumentTypes(id); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/document/:id'), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const document = umbDocumentData.getById(id); - return res(ctx.status(200), ctx.json(document)); - }), - - rest.delete(umbracoPath('/document/:id'), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - umbDocumentData.delete([id]); - return res(ctx.status(200)); - }), - - rest.put(umbracoPath(`/document/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - umbDocumentData.save(id, data); - return res(ctx.status(200)); - }), - - rest.post(umbracoPath(`/document`), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - umbDocumentData.insert(data); - return res(ctx.status(200)); - }), -]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/index.ts index f02652bc13..154739b722 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/index.ts @@ -1,13 +1,15 @@ -import { handlers as recycleBinHandlers } from './recycle-bin.handlers.js'; -import { handlers as treeHandlers } from './tree.handlers.js'; -import { handlers as documentHandlers } from './document.handlers.js'; -import { handlers as itemHandlers } from './item.handlers.js'; -import { handlers as permissionHandlers } from './permission.handlers.js'; +import { recycleBinHandlers } from './recycle-bin.handlers.js'; +import { treeHandlers } from './tree.handlers.js'; +import { itemHandlers } from './item.handlers.js'; +import { permissionHandlers } from './permission.handlers.js'; +import { publishingHandlers } from './publishing.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; export const handlers = [ ...recycleBinHandlers, ...permissionHandlers, ...treeHandlers, ...itemHandlers, - ...documentHandlers, + ...publishingHandlers, + ...detailHandlers, ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/item.handlers.ts index 87fcf83b30..44179c36c6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/item.handlers.ts @@ -1,13 +1,13 @@ const { rest } = window.MockServiceWorker; -import { umbDocumentData } from '../../data/document.data.js'; +import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const handlers = [ +export const itemHandlers = [ rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { const ids = req.url.searchParams.getAll('id'); if (!ids) return; - const items = umbDocumentData.getItems(ids); + const items = umbDocumentMockDb.item.getItems(ids); return res(ctx.status(200), ctx.json(items)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts index d663059f07..c5f828261b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts @@ -1,14 +1,14 @@ const { rest } = window.MockServiceWorker; -import { umbDocumentData } from '../../data/document.data.js'; +import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; // TODO: temp handlers until we have a real API -export const handlers = [ +export const permissionHandlers = [ rest.get(umbracoPath(`${UMB_SLUG}/:id/permissions`), (req, res, ctx) => { const id = req.params.id as string; if (!id) return; - const response = umbDocumentData.getUserPermissionsForDocument(id); + const response = umbDocumentMockDb.getUserPermissionsForDocument(id); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/publishing.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/publishing.handlers.ts new file mode 100644 index 0000000000..52c498fc44 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/publishing.handlers.ts @@ -0,0 +1,25 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentMockDb } from '../../data/document/document.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { PublishDocumentRequestModel, UnpublishDocumentRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const publishingHandlers = [ + rest.put(umbracoPath(`${UMB_SLUG}/:id/publish`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const requestBody = (await req.json()) as PublishDocumentRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbDocumentMockDb.publishing.publish(id, requestBody); + return res(ctx.status(200)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/:id/unpublish`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const requestBody = (await req.json()) as UnpublishDocumentRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbDocumentMockDb.publishing.unpublish(id, requestBody); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/recycle-bin.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/recycle-bin.handlers.ts index 4776bea829..2b842595f7 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/recycle-bin.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/recycle-bin.handlers.ts @@ -1,20 +1,25 @@ const { rest } = window.MockServiceWorker; -import { umbDocumentData } from '../../data/document.data.js'; +import { umbDocumentMockDb } from '../../data/document/document.db.js'; +import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const handlers = [ - rest.get(umbracoPath(`/recycle-bin/document/root`), (req, res, ctx) => { - const response = umbDocumentData.getRecycleBinRoot(); - +export const recycleBinHandlers = [ + rest.get(umbracoPath(`/recycle-bin${UMB_SLUG}/root`), (req, res, ctx) => { + const response = umbDocumentMockDb.recycleBin.tree.getRoot(); return res(ctx.status(200), ctx.json(response)); }), - rest.get(umbracoPath(`/recycle-bin/document/children`), (req, res, ctx) => { + rest.get(umbracoPath(`/recycle-bin${UMB_SLUG}/children`), (req, res, ctx) => { const parentId = req.url.searchParams.get('parentId'); if (!parentId) return; - - const response = umbDocumentData.getRecycleBinChildrenOf(parentId); - + const response = umbDocumentMockDb.recycleBin.tree.getChildrenOf(parentId); return res(ctx.status(200), ctx.json(response)); }), + + rest.put(umbracoPath(`${UMB_SLUG}/:id/move-to-recycle-bin`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + umbDocumentMockDb.recycleBin.trash([id]); + return res(ctx.status(200)); + }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts index 71636ef42c..e2a0aacc7e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts @@ -1,17 +1,18 @@ const { rest } = window.MockServiceWorker; -import { umbDocumentData } from '../../data/document.data.js'; +import { umbDocumentMockDb } from '../../data/document/document.db.js'; +import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const handlers = [ - rest.get(umbracoPath('/tree/document/root'), (req, res, ctx) => { - const response = umbDocumentData.getTreeRoot(); +export const treeHandlers = [ + rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { + const response = umbDocumentMockDb.tree.getRoot(); return res(ctx.status(200), ctx.json(response)); }), - rest.get(umbracoPath('/tree/document/children'), (req, res, ctx) => { + rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { const parentId = req.url.searchParams.get('parentId'); if (!parentId) return; - const response = umbDocumentData.getTreeItemChildrenOf(parentId); + const response = umbDocumentMockDb.tree.getChildrenOf(parentId); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dynamic-root.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dynamic-root.handlers.ts new file mode 100644 index 0000000000..c7c0072f06 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dynamic-root.handlers.ts @@ -0,0 +1,15 @@ +import { umbDocumentMockDb } from '../data/document/document.db.js'; +import type { DynamicRootRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +const { rest } = window.MockServiceWorker; + +export const handlers = [ + rest.post(umbracoPath('/dynamic-root/query'), async (req, res, ctx) => { + const response = umbDocumentMockDb.tree + .getRoot() + .items.map((item) => item.id) + .slice(0, 1); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/examine-management.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/examine-management.handlers.ts index 43532d2d13..7dc2891ae5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/examine-management.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/examine-management.handlers.ts @@ -2,7 +2,7 @@ const { rest } = window.MockServiceWorker; import { searchResultMockData, getIndexByName, PagedIndexers } from '../data/examine.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { +import type { IndexResponseModel, PagedIndexResponseModel, PagedSearcherResponseModel, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/health-check.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/health-check.handlers.ts index 525a593ed6..36d0660699 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/health-check.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/health-check.handlers.ts @@ -7,12 +7,13 @@ import { healthGroupsWithoutResult, } from '../data/health-check.data.js'; -import { +import type { HealthCheckActionRequestModel, HealthCheckGroupResponseModel, HealthCheckGroupWithResultResponseModel, HealthCheckResultResponseModel, - PagedHealthCheckGroupResponseModel, + PagedHealthCheckGroupResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { StatusResultTypeModel, } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/install.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/install.handlers.ts index 6a126019bf..8c43cf7fca 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/install.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/install.handlers.ts @@ -1,9 +1,10 @@ const { rest } = window.MockServiceWorker; -import { +import type { DatabaseInstallResponseModel, InstallVResponseModel, InstallSettingsResponseModel, - ProblemDetails, + ProblemDetails} from '@umbraco-cms/backoffice/backend-api'; +import { TelemetryLevelModel, } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -29,7 +30,7 @@ export const handlers = [ { level: TelemetryLevelModel.DETAILED, description: - 'We will send:
  • Anonymized site ID, umbraco version, and packages installed.
  • Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, and Property Editors in use.
  • System information: Webserver, server OS, server framework, server OS language, and database provider.
  • Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, and if you are in debug mode.
We might change what we send on the Detailed level in the future. If so, it will be listed above.
By choosing "Detailed" you agree to current and future anonymized information being collected.
', + 'We will send:
  • Anonymized site ID, umbraco version, and packages installed.
  • Number of: Root nodes, Content nodes, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, and Property Editors in use.
  • System information: Webserver, server OS, server framework, server OS language, and database provider.
  • Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, and if you are in debug mode.
We might change what we send on the Detailed level in the future. If so, it will be listed above.
By choosing "Detailed" you agree to current and future anonymized information being collected.
', }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/language.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/language.handlers.ts index 1200f10772..61101d41de 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/language.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/language.handlers.ts @@ -1,6 +1,6 @@ const { rest } = window.MockServiceWorker; import { umbLanguagesData } from '../data/languages.data.js'; -import { LanguageResponseModel, ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; +import type { LanguageResponseModel, ProblemDetails } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; // TODO: add schema diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/log-viewer.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/log-viewer.handlers.ts index 836a4ae1ef..20a37687dc 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/log-viewer.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/log-viewer.handlers.ts @@ -1,7 +1,7 @@ const { rest } = window.MockServiceWorker; import { umbLogViewerData } from '../data/log-viewer.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { SavedLogSearchRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { SavedLogSearchRequestModel } from '@umbraco-cms/backoffice/backend-api'; export const handlers = [ //#region Searches diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/detail.handlers.ts index 9d718c6ff8..18ffd1b3f5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/detail.handlers.ts @@ -1,44 +1,45 @@ const { rest } = window.MockServiceWorker; -import { umbMediaTypeData } from '../../data/media-type.data.js'; +import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; import { UMB_SLUG } from './slug.js'; +import type { CreateMediaTypeRequestModel, UpdateMediaTypeRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + const requestBody = (await req.json()) as CreateMediaTypeRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); - umbMediaTypeData.insert(data); + const id = umbMediaTypeMockDb.detail.create(requestBody); - return res(ctx.status(200)); + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); }), rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - - const data = umbMediaTypeData.getById(id); - - return res(ctx.status(200), ctx.json(data)); + if (!id) return res(ctx.status(400)); + const response = umbMediaTypeMockDb.detail.read(id); + return res(ctx.status(200), ctx.json(response)); }), rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - - umbMediaTypeData.save(id, data); - + if (!id) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateMediaTypeRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbMediaTypeMockDb.detail.update(id, requestBody); return res(ctx.status(200)); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { + rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - - umbMediaTypeData.delete([id]); - + if (!id) return res(ctx.status(400)); + umbMediaTypeMockDb.detail.delete(id); return res(ctx.status(200)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/folder.handlers.ts new file mode 100644 index 0000000000..6d666827d2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/folder.handlers.ts @@ -0,0 +1,44 @@ +const { rest } = window.MockServiceWorker; +import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const folderHandlers = [ + rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { + const requestBody = await req.json(); + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const id = umbMediaTypeMockDb.folder.create(requestBody); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const response = umbMediaTypeMockDb.folder.read(id); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400, 'no id found')); + const requestBody = await req.json(); + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbMediaTypeMockDb.folder.update(id, requestBody); + return res(ctx.status(200)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + umbMediaTypeMockDb.folder.delete(id); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/index.ts index 236354678a..4f09cd2e16 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/index.ts @@ -1,5 +1,6 @@ import { treeHandlers } from './tree.handlers.js'; import { itemHandlers } from './item.handlers.js'; import { detailHandlers } from './detail.handlers.js'; +import { folderHandlers } from './folder.handlers.js'; -export const handlers = [...treeHandlers, ...itemHandlers, ...detailHandlers]; +export const handlers = [...treeHandlers, ...itemHandlers, ...folderHandlers, ...detailHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/item.handlers.ts index 92e090c2bd..8c4dc3eed6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/item.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbMediaTypeData } from '../../data/media-type.data.js'; +import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -7,14 +7,7 @@ export const itemHandlers = [ rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { const ids = req.url.searchParams.getAll('id'); if (!ids) return; - const items = umbMediaTypeData.getItems(ids); - return res(ctx.status(200), ctx.json(items)); - }), - - rest.get(umbracoPath(`/tree${UMB_SLUG}/item`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (!ids) return; - const items = umbMediaTypeData.getTreeItems(ids); + const items = umbMediaTypeMockDb.item.getItems(ids); return res(ctx.status(200), ctx.json(items)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts index d15ed562c5..335f3d1728 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts @@ -1,29 +1,18 @@ const { rest } = window.MockServiceWorker; -import { umbMediaTypeData } from '../../data/media-type.data.js'; +import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const rootItems = umbMediaTypeData.getTreeRoot(); - const response = { - total: rootItems.length, - items: rootItems, - }; + const response = umbMediaTypeMockDb.tree.getRoot(); return res(ctx.status(200), ctx.json(response)); }), rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { const parentId = req.url.searchParams.get('parentId'); if (!parentId) return; - - const children = umbMediaTypeData.getTreeItemChildren(parentId); - - const response = { - total: children.length, - items: children, - }; - + const response = umbMediaTypeMockDb.tree.getChildrenOf(parentId); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media.handlers.ts deleted file mode 100644 index e5348d38ca..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media.handlers.ts +++ /dev/null @@ -1,66 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { umbMediaData } from '../data/media.data.js'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; - -// TODO: add schema -export const handlers = [ - rest.get(umbracoPath('/media/item'), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (!ids) return; - const items = umbMediaData.getItems(ids); - return res(ctx.status(200), ctx.json(items)); - }), - - rest.get('/umbraco/management/api/v1/media/details/:id', (req, res, ctx) => { - console.warn('Please move to schema'); - const id = req.params.id as string; - if (!id) return; - - const media = umbMediaData.getById(id); - - return res(ctx.status(200), ctx.json([media])); - }), - - rest.post('/umbraco/management/api/v1/media/save', async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - - umbMediaData.save(data.id, data); - - return res(ctx.status(200)); - }), - - rest.post('/umbraco/management/api/v1/media/move', async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - umbMediaData.move(data.ids, data.destination); - return res(ctx.status(200)); - }), - - rest.post('/umbraco/management/api/v1/media/trash', async (req, res, ctx) => { - const ids = await req.json(); - const trashed = umbMediaData.trash(ids); - return res(ctx.status(200), ctx.json(trashed)); - }), - - rest.get('/umbraco/management/api/v1/tree/media/root', (req, res, ctx) => { - const response = umbMediaData.getTreeRoot(); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get('/umbraco/management/api/v1/tree/media/children', (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); - if (!parentId) return; - const response = umbMediaData.getTreeItemChildren(parentId); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get('/umbraco/management/api/v1/tree/media/item', (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (!ids) return; - - const items = umbMediaData.getTreeItem(ids); - - return res(ctx.status(200), ctx.json(items)); - }), -]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/detail.handlers.ts new file mode 100644 index 0000000000..83acb4e569 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/detail.handlers.ts @@ -0,0 +1,45 @@ +const { rest } = window.MockServiceWorker; +import { umbMediaMockDb } from '../../data/media/media.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { CreateMediaRequestModel, UpdateMediaRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const detailHandlers = [ + rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateMediaRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const id = umbMediaMockDb.detail.create(requestBody); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const response = umbMediaMockDb.detail.read(id); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateMediaRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbMediaMockDb.detail.update(id, requestBody); + return res(ctx.status(200)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + umbMediaMockDb.detail.delete(id); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/index.ts new file mode 100644 index 0000000000..963a027993 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/index.ts @@ -0,0 +1,6 @@ +import { recycleBinHandlers } from './recycle-bin.handlers.js'; +import { treeHandlers } from './tree.handlers.js'; +import { itemHandlers } from './item.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; + +export const handlers = [...recycleBinHandlers, ...treeHandlers, ...itemHandlers, ...detailHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/item.handlers.ts new file mode 100644 index 0000000000..8050fbeeb3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/item.handlers.ts @@ -0,0 +1,13 @@ +const { rest } = window.MockServiceWorker; +import { umbMediaMockDb } from '../../data/media/media.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const itemHandlers = [ + rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbMediaMockDb.item.getItems(ids); + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/recycle-bin.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/recycle-bin.handlers.ts new file mode 100644 index 0000000000..edc15eff9d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/recycle-bin.handlers.ts @@ -0,0 +1,25 @@ +const { rest } = window.MockServiceWorker; +import { umbMediaMockDb } from '../../data/media/media.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const recycleBinHandlers = [ + rest.get(umbracoPath(`/recycle-bin${UMB_SLUG}/root`), (req, res, ctx) => { + const response = umbMediaMockDb.recycleBin.tree.getRoot(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/recycle-bin${UMB_SLUG}/children`), (req, res, ctx) => { + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + const response = umbMediaMockDb.recycleBin.tree.getChildrenOf(parentId); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/:id/move-to-recycle-bin`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return res(ctx.status(400)); + umbMediaMockDb.recycleBin.trash([id]); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/slug.ts new file mode 100644 index 0000000000..4e0336d30b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/media'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts new file mode 100644 index 0000000000..b57b17e3a1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts @@ -0,0 +1,18 @@ +const { rest } = window.MockServiceWorker; +import { umbMediaMockDb } from '../../data/media/media.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const treeHandlers = [ + rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { + const response = umbMediaMockDb.tree.getRoot(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + const response = umbMediaMockDb.tree.getChildrenOf(parentId); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/modelsbuilder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/modelsbuilder.handlers.ts index 2caf6eb3e4..4273f5f24f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/modelsbuilder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/modelsbuilder.handlers.ts @@ -1,10 +1,11 @@ const { rest } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { +import type { ModelsBuilderResponseModel, + OutOfDateStatusResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { ModelsModeModel, - OutOfDateStatusResponseModel, OutOfDateTypeModel, } from '@umbraco-cms/backoffice/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/package.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/package.handlers.ts index ab4eb43ec4..25cb6cb123 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/package.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/package.handlers.ts @@ -2,7 +2,7 @@ const { rest } = window.MockServiceWorker; import { UmbId } from '@umbraco-cms/backoffice/id'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { +import type { PackageDefinitionResponseModel, PagedPackageDefinitionResponseModel, PagedPackageMigrationStatusResponseModel, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/detail.handlers.ts new file mode 100644 index 0000000000..f0ee2fb5b2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/detail.handlers.ts @@ -0,0 +1,44 @@ +const { rest } = window.MockServiceWorker; +import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { CreateStylesheetRequestModel, UpdateStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const detailHandlers = [ + rest.post(umbracoPath(UMB_SLUG), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const path = umbPartialViewMockDB.file.create(requestBody); + const encodedPath = encodeURIComponent(path); + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const response = umbPartialViewMockDB.file.read(decodeURIComponent(path)); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + umbPartialViewMockDB.file.delete(decodeURIComponent(path)); + return res(ctx.status(200)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/:path`), async (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbPartialViewMockDB.file.update(decodeURIComponent(path), requestBody); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/folder.handlers.ts new file mode 100644 index 0000000000..6c18bf61b8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/folder.handlers.ts @@ -0,0 +1,36 @@ +const { rest } = window.MockServiceWorker; +import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { CreatePartialViewFolderRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const folderHandlers = [ + rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreatePartialViewFolderRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const path = umbPartialViewMockDB.folder.create(requestBody); + const encodedPath = encodeURIComponent(path); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const response = umbPartialViewMockDB.folder.read(decodeURIComponent(path)); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + umbPartialViewMockDB.folder.delete(decodeURIComponent(path)); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/index.ts new file mode 100644 index 0000000000..e07942289d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/index.ts @@ -0,0 +1,15 @@ +import { folderHandlers } from './folder.handlers.js'; +import { treeHandlers } from './tree.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; +import { itemHandlers } from './item.handlers.js'; +import { snippetHandlers } from './snippet.handlers.js'; +import { renameHandlers } from './rename.handlers.js'; + +export const handlers = [ + ...treeHandlers, + ...itemHandlers, + ...folderHandlers, + ...snippetHandlers, + ...renameHandlers, + ...detailHandlers, +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/item.handlers.ts new file mode 100644 index 0000000000..9869404c04 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/item.handlers.ts @@ -0,0 +1,14 @@ +const { rest } = window.MockServiceWorker; +import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const itemHandlers = [ + rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { + const paths = req.url.searchParams.getAll('path'); + if (!paths) return res(ctx.status(400, 'no body found')); + const decodedPaths = paths.map((path) => decodeURI(path)); + const items = umbPartialViewMockDB.item.getItems(decodedPaths); + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/rename.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/rename.handlers.ts new file mode 100644 index 0000000000..cfdd4f6559 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/rename.handlers.ts @@ -0,0 +1,26 @@ +const { rest } = window.MockServiceWorker; +import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { RenameStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const renameHandlers = [ + rest.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + + const requestBody = (await req.json()) as RenameStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const newPath = umbPartialViewMockDB.file.rename(decodeURIComponent(path), requestBody.name); + const encodedPath = encodeURIComponent(newPath); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/slug.ts new file mode 100644 index 0000000000..c501894425 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/partial-view'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/snippet.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/snippet.handlers.ts new file mode 100644 index 0000000000..035570ad3e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/snippet.handlers.ts @@ -0,0 +1,18 @@ +const { rest } = window.MockServiceWorker; +import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const snippetHandlers = [ + rest.get(umbracoPath(`${UMB_SLUG}/snippet`), (req, res, ctx) => { + const response = umbPartialViewMockDB.getSnippets(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/snippet/:fileName`), (req, res, ctx) => { + const fileName = req.params.fileName as string; + if (!fileName) return res(ctx.status(400)); + const response = umbPartialViewMockDB.getSnippet(fileName); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts new file mode 100644 index 0000000000..8848ec8be6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts @@ -0,0 +1,18 @@ +const { rest } = window.MockServiceWorker; +import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const treeHandlers = [ + rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { + const response = umbPartialViewMockDB.tree.getRoot(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { + const parentPath = req.url.searchParams.get('parentPath'); + if (!parentPath) return res(ctx.status(400)); + const response = umbPartialViewMockDB.tree.getChildrenOf(parentPath); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-views.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-views.handlers.ts deleted file mode 100644 index 6166c10022..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-views.handlers.ts +++ /dev/null @@ -1,60 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { RestHandler, MockedRequest, DefaultBodyType } from 'msw'; -import { umbPartialViewsData, umbPartialViewsTreeData } from '../data/partial-views.data.js'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; - -const treeHandlers = [ - rest.get(umbracoPath('/tree/partial-view/root'), (req, res, ctx) => { - const response = umbPartialViewsTreeData.getTreeRoot(); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/tree/partial-view/children'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return; - - const response = umbPartialViewsTreeData.getTreeItemChildren(path); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/tree/partial-view/item'), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('paths'); - if (!paths) return; - - const items = umbPartialViewsTreeData.getTreeItem(paths); - return res(ctx.status(200), ctx.json(items)); - }), -]; - -const detailHandlers: RestHandler>[] = [ - rest.get(umbracoPath('/partial-view'), (req, res, ctx) => { - const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-cshtml', '.cshtml'); - if (!path) return res(ctx.status(400)); - const response = umbPartialViewsData.getPartialView(path); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.post(umbracoPath('/partial-view'), async (req, res, ctx) => { - const requestBody = await req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); - const response = umbPartialViewsData.insertPartialView(requestBody); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.delete(umbracoPath('/partial-view'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return res(ctx.status(400)); - umbPartialViewsData.delete([path]); - return res(ctx.status(200)); - }), - - rest.put(umbracoPath('/partial-view'), async (req, res, ctx) => { - const requestBody = await req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); - umbPartialViewsData.updateData(requestBody); - return res(ctx.status(200)); - }), -]; -const folderHandlers: RestHandler>[] = []; - -export const handlers = [...treeHandlers, ...detailHandlers, ...folderHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/redirect-management.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/redirect-management.handlers.ts index c9886f1f13..d683519dd9 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/redirect-management.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/redirect-management.handlers.ts @@ -1,10 +1,11 @@ const { rest } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { +import type { PagedRedirectUrlResponseModel, RedirectUrlResponseModel, - RedirectStatusModel, - RedirectUrlStatusResponseModel, + RedirectUrlStatusResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { + RedirectStatusModel } from '@umbraco-cms/backoffice/backend-api'; export const handlers = [ diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/rte-embed.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/rte-embed.handlers.ts index 122e4677e5..16719a60b6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/rte-embed.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/rte-embed.handlers.ts @@ -1,5 +1,6 @@ const { rest } = window.MockServiceWorker; -import { OEmbedResult, OEmbedStatus } from '@umbraco-cms/backoffice/modal'; +import type { OEmbedResult} from '@umbraco-cms/backoffice/modal'; +import { OEmbedStatus } from '@umbraco-cms/backoffice/modal'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/detail.handlers.ts new file mode 100644 index 0000000000..fd1a646ab5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/detail.handlers.ts @@ -0,0 +1,44 @@ +const { rest } = window.MockServiceWorker; +import { umbScriptMockDb } from '../../data/script/script.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { CreateStylesheetRequestModel, UpdateStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const detailHandlers = [ + rest.post(umbracoPath(UMB_SLUG), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const path = umbScriptMockDb.file.create(requestBody); + const encodedPath = encodeURIComponent(path); + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const response = umbScriptMockDb.file.read(decodeURIComponent(path)); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + umbScriptMockDb.file.delete(decodeURIComponent(path)); + return res(ctx.status(200)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/:path`), async (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbScriptMockDb.file.update(decodeURIComponent(path), requestBody); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/folder.handlers.ts new file mode 100644 index 0000000000..462afcb94e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/folder.handlers.ts @@ -0,0 +1,36 @@ +const { rest } = window.MockServiceWorker; +import { umbScriptMockDb } from '../../data/script/script.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { CreateScriptFolderRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const folderHandlers = [ + rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateScriptFolderRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const path = umbScriptMockDb.folder.create(requestBody); + const encodedPath = encodeURIComponent(path); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const response = umbScriptMockDb.folder.read(decodeURIComponent(path)); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + umbScriptMockDb.folder.delete(decodeURIComponent(path)); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/index.ts new file mode 100644 index 0000000000..34d8d576a3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/index.ts @@ -0,0 +1,7 @@ +import { folderHandlers } from './folder.handlers.js'; +import { treeHandlers } from './tree.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; +import { itemHandlers } from './item.handlers.js'; +import { renameHandlers } from './rename.handlers.js'; + +export const handlers = [...treeHandlers, ...itemHandlers, ...folderHandlers, ...renameHandlers, ...detailHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/item.handlers.ts new file mode 100644 index 0000000000..34e725d86e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/item.handlers.ts @@ -0,0 +1,14 @@ +const { rest } = window.MockServiceWorker; +import { umbScriptMockDb } from '../../data/script/script.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const itemHandlers = [ + rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { + const paths = req.url.searchParams.getAll('path'); + if (!paths) return res(ctx.status(400, 'no body found')); + const decodedPaths = paths.map((path) => decodeURI(path)); + const items = umbScriptMockDb.item.getItems(decodedPaths); + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/rename.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/rename.handlers.ts new file mode 100644 index 0000000000..7c9dfaf39d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/rename.handlers.ts @@ -0,0 +1,26 @@ +const { rest } = window.MockServiceWorker; +import { umbScriptMockDb } from '../../data/script/script.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { RenameStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const renameHandlers = [ + rest.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + + const requestBody = (await req.json()) as RenameStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const newPath = umbScriptMockDb.file.rename(decodeURIComponent(path), requestBody.name); + const encodedPath = encodeURIComponent(newPath); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/slug.ts new file mode 100644 index 0000000000..98125fd55d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/script'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts new file mode 100644 index 0000000000..89972b3c6e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts @@ -0,0 +1,18 @@ +const { rest } = window.MockServiceWorker; +import { umbScriptMockDb } from '../../data/script/script.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const treeHandlers = [ + rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { + const response = umbScriptMockDb.tree.getRoot(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { + const parentPath = req.url.searchParams.get('parentPath'); + if (!parentPath) return res(ctx.status(400)); + const response = umbScriptMockDb.tree.getChildrenOf(parentPath); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts deleted file mode 100644 index 1ccd89e2ea..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts +++ /dev/null @@ -1,88 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { RestHandler, MockedRequest, DefaultBodyType } from 'msw'; -import { umbScriptsData } from '../data/scripts.data.js'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { CreateScriptRequestModel, UpdateScriptRequestModel } from '@umbraco-cms/backoffice/backend-api'; - -const treeHandlers = [ - rest.get(umbracoPath('/tree/script/root'), (req, res, ctx) => { - const response = umbScriptsData.getTreeRoot(); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/tree/script/children'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return; - - const response = umbScriptsData.getTreeItemChildren(path); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/tree/script/item'), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('paths'); - if (!paths) return; - - const items = umbScriptsData.getTreeItem(paths); - return res(ctx.status(200), ctx.json(items)); - }), -]; - -const detailHandlers: RestHandler>[] = [ - rest.get(umbracoPath('/script'), (req, res, ctx) => { - const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); - if (!path) return res(ctx.status(400)); - const response = umbScriptsData.getScript(path); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/script/item'), (req, res, ctx) => { - const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); - if (!path) return res(ctx.status(400, 'no body found')); - const response = umbScriptsData.getItem([path]); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.post(umbracoPath('/script'), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateScriptRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); - const response = umbScriptsData.insertScript(requestBody); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.delete(umbracoPath('/script'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return res(ctx.status(400)); - const response = umbScriptsData.delete([path]); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.put(umbracoPath('/script'), async (req, res, ctx) => { - const requestBody = (await req.json()) as UpdateScriptRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); - return res(ctx.status(200)); - }), -]; - -const folderHandlers: RestHandler>[] = [ - rest.get(umbracoPath('script/folder'), (req, res, ctx) => { - const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); - if (!path) return res(ctx.status(400)); - const response = umbScriptsData.getFolder(path); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.post(umbracoPath('script/folder'), (req, res, ctx) => { - const requestBody = req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); - return res(ctx.status(200)); - }), - - rest.delete(umbracoPath('script/folder'), (req, res, ctx) => { - const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); - if (!path) return res(ctx.status(400)); - const response = umbScriptsData.deleteFolder(path); - return res(ctx.status(200), ctx.json(response)); - }), -]; - -export const handlers = [...treeHandlers, ...detailHandlers, ...folderHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/server.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/server.handlers.ts index b62fb9112a..9b5c182fff 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/server.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/server.handlers.ts @@ -1,8 +1,10 @@ const { rest } = window.MockServiceWorker; +import type { + ServerStatusResponseModel, + ServerInformationResponseModel} from '@umbraco-cms/backoffice/backend-api'; import { RuntimeLevelModel, - ServerStatusResponseModel, - VersionResponseModel, + RuntimeModeModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -36,12 +38,15 @@ export const serverMustUpgradeHandler = rest.get(umbracoPath('/server/status'), ); }); -export const serverVersionHandler = rest.get(umbracoPath('/server/version'), (_req, res, ctx) => { +export const serverInformationHandler = rest.get(umbracoPath('/server/information'), (_req, res, ctx) => { return res( // Respond with a 200 status code ctx.status(200), - ctx.json({ - version: '13.0.0', + ctx.json({ + version: '14.0.0-preview004', + assemblyVersion: '14.0.0-preview004', + baseUtcOffset: '01:00:00', + runtimeMode: RuntimeModeModel.BACKOFFICE_DEVELOPMENT, }), ); }); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file.handlers.ts deleted file mode 100644 index bd989512e1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file.handlers.ts +++ /dev/null @@ -1,39 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { umbStaticFileData } from '../data/static-file.data.js'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; - -const treeHandlers = [ - rest.get(umbracoPath('/tree/static-file/root'), (req, res, ctx) => { - const response = umbStaticFileData.getTreeRoot(); - return res(ctx.status(200), ctx.json(response)); - }), - rest.get(umbracoPath('/tree/static-file/children'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return; - - const response = umbStaticFileData.getTreeItemChildren(path); - return res(ctx.status(200), ctx.json(response)); - }), -]; - -const __treeHandlers = [ - rest.get(umbracoPath('/tree/static-file/item'), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('paths'); - if (!paths) return; - - const items = umbStaticFileData.getTreeItem(paths); - return res(ctx.status(200), ctx.json(items)); - }), -]; - -const itemHandlers = [ - rest.get(umbracoPath('/static-file/item'), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('paths'); - if (!paths) return; - - const items = umbStaticFileData.getTreeItem(paths); - return res(ctx.status(200), ctx.json(items)); - }), -]; - -export const handlers = [...treeHandlers, ...itemHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/index.ts new file mode 100644 index 0000000000..c342e001ad --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/index.ts @@ -0,0 +1,4 @@ +import { treeHandlers } from './tree.handlers.js'; +import { itemHandlers } from './item.handlers.js'; + +export const handlers = [...treeHandlers, ...itemHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/item.handlers.ts new file mode 100644 index 0000000000..93419e7231 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/item.handlers.ts @@ -0,0 +1,13 @@ +const { rest } = window.MockServiceWorker; +import { umbStaticFileMockDb } from '../../data/static-file/static-file.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const itemHandlers = [ + rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { + const paths = req.url.searchParams.getAll('paths'); + if (!paths) return res(ctx.status(400, 'no body found')); + const items = umbStaticFileMockDb.item.getItems(paths); + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/slug.ts new file mode 100644 index 0000000000..ef841dbd9f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/static-file'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts new file mode 100644 index 0000000000..ca0a038895 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts @@ -0,0 +1,18 @@ +const { rest } = window.MockServiceWorker; +import { umbStaticFileMockDb } from '../../data/static-file/static-file.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const treeHandlers = [ + rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { + const response = umbStaticFileMockDb.tree.getRoot(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { + const parentPath = req.url.searchParams.get('parentPath'); + if (!parentPath) return res(ctx.status(400)); + const response = umbStaticFileMockDb.tree.getChildrenOf(parentPath); + 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 deleted file mode 100644 index 129582f308..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet.handlers.ts +++ /dev/null @@ -1,132 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { umbStylesheetData } from '../data/stylesheet.data.js'; -import { - CreatePathFolderRequestModel, - CreateStylesheetRequestModel, - CreateTextFileViewModelBaseModel, - InterpolateRichTextStylesheetRequestModel, - UpdateStylesheetRequestModel, -} from '@umbraco-cms/backoffice/backend-api'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; - -const treeHandlers = [ - rest.get(umbracoPath('/tree/stylesheet/root'), (req, res, ctx) => { - const response = umbStylesheetData.getTreeRoot(); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/tree/stylesheet/children'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return; - - const response = umbStylesheetData.getTreeItemChildren(path); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/tree/stylesheet/item'), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('paths'); - if (!paths) return; - - const items = umbStylesheetData.getTreeItem(paths); - return res(ctx.status(200), ctx.json(items)); - }), -]; - -const detailHandlers = [ - rest.get(umbracoPath('/stylesheet'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return; - - const response = umbStylesheetData.getStylesheet(path); - return res(ctx.status(200), ctx.json(response)); - }), - - 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)); - }), - - rest.delete(umbracoPath('/stylesheet'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return res(ctx.status(400)); - const response = umbStylesheetData.delete([path]); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.put(umbracoPath('/stylesheet'), async (req, res, ctx) => { - 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)); - }), - - rest.get(umbracoPath('/v1/stylesheet/all'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return; - - const response = umbStylesheetData.getAllStylesheets(); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/v1/stylesheet/item'), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('path'); - if (!paths) return; - - const items = umbStylesheetData.getItems(paths); - return res(ctx.status(200), ctx.json(items)); - }), -]; - -const rulesHandlers = [ - rest.post(umbracoPath('/stylesheet/rich-text/extract-rules'), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateStylesheetRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); - const response = await umbStylesheetData.extractRules({ requestBody }); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.post(umbracoPath('/stylesheet/rich-text/interpolate-rules'), async (req, res, ctx) => { - const requestBody = (await req.json()) as InterpolateRichTextStylesheetRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); - const response = umbStylesheetData.interpolateRules({ requestBody }); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/stylesheet/rich-text/rules'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return res(ctx.status(400)); - try { - const response = umbStylesheetData.getRules(path); - return res(ctx.status(200), ctx.json(response)); - } catch (e) { - return res(ctx.status(404)); - } - }), -]; - -const folderHandlers = [ - rest.get(umbracoPath('/v1/stylesheet/all'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return; - - const response = umbStylesheetData.getFolder(path); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.post(umbracoPath('/stylesheet/folder'), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreatePathFolderRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); - return res(ctx.status(200)); - }), - - rest.delete(umbracoPath('/stylesheet/folder'), (req, res, ctx) => { - const path = req.url.searchParams.get('path'); - if (!path) return res(ctx.status(400)); - const response = umbStylesheetData.delete([path]); - return res(ctx.status(200), ctx.json(response)); - }), -]; - -export const handlers = [...treeHandlers, ...detailHandlers, ...folderHandlers, ...rulesHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/detail.handlers.ts new file mode 100644 index 0000000000..0ea95bf4e8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/detail.handlers.ts @@ -0,0 +1,45 @@ +const { rest } = window.MockServiceWorker; +import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { CreateStylesheetRequestModel, UpdateStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const detailHandlers = [ + rest.post(umbracoPath(UMB_SLUG), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const path = umbStylesheetMockDb.file.create(requestBody); + const encodedPath = encodeURIComponent(path); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const response = umbStylesheetMockDb.file.read(decodeURIComponent(path)); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + umbStylesheetMockDb.file.delete(decodeURIComponent(path)); + return res(ctx.status(200)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/:path`), async (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbStylesheetMockDb.file.update(decodeURIComponent(path), requestBody); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/folder.handlers.ts new file mode 100644 index 0000000000..b4cb67bdfc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/folder.handlers.ts @@ -0,0 +1,37 @@ +const { rest } = window.MockServiceWorker; +import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { CreateStylesheetFolderRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const folderHandlers = [ + rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { + const requestBody = (await req.json()) as CreateStylesheetFolderRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const path = umbStylesheetMockDb.folder.create(requestBody); + const encodedPath = encodeURIComponent(path); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + const response = umbStylesheetMockDb.folder.read(decodeURIComponent(path)); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + umbStylesheetMockDb.folder.delete(decodeURIComponent(path)); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/index.ts new file mode 100644 index 0000000000..34d8d576a3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/index.ts @@ -0,0 +1,7 @@ +import { folderHandlers } from './folder.handlers.js'; +import { treeHandlers } from './tree.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; +import { itemHandlers } from './item.handlers.js'; +import { renameHandlers } from './rename.handlers.js'; + +export const handlers = [...treeHandlers, ...itemHandlers, ...folderHandlers, ...renameHandlers, ...detailHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/item.handlers.ts new file mode 100644 index 0000000000..5406b602bc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/item.handlers.ts @@ -0,0 +1,14 @@ +const { rest } = window.MockServiceWorker; +import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const itemHandlers = [ + rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { + const paths = req.url.searchParams.getAll('path'); + if (!paths) return res(ctx.status(400, 'no body found')); + const decodedPaths = paths.map((path) => decodeURI(path)); + const items = umbStylesheetMockDb.item.getItems(decodedPaths); + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/rename.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/rename.handlers.ts new file mode 100644 index 0000000000..f20fb86832 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/rename.handlers.ts @@ -0,0 +1,26 @@ +const { rest } = window.MockServiceWorker; +import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { RenameStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const renameHandlers = [ + rest.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async (req, res, ctx) => { + const path = req.params.path as string; + if (!path) return res(ctx.status(400)); + + const requestBody = (await req.json()) as RenameStylesheetRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + + const newPath = umbStylesheetMockDb.file.rename(decodeURIComponent(path), requestBody.name); + const encodedPath = encodeURIComponent(newPath); + + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + encodedPath, + 'Umb-Generated-Resource': encodedPath, + }), + ); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/slug.ts new file mode 100644 index 0000000000..fce9f77381 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/stylesheet'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts new file mode 100644 index 0000000000..7441982c84 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts @@ -0,0 +1,18 @@ +const { rest } = window.MockServiceWorker; +import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const treeHandlers = [ + rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { + const response = umbStylesheetMockDb.tree.getRoot(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { + const parentPath = req.url.searchParams.get('parentPath'); + if (!parentPath) return res(ctx.status(400)); + const response = umbStylesheetMockDb.tree.getChildrenOf(parentPath); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/tag-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/tag-handlers.ts index 89e89f26c2..d99de8bef5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/tag-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/tag-handlers.ts @@ -1,6 +1,6 @@ const { rest } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { PagedTagResponseModel, TagResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { PagedTagResponseModel, TagResponseModel } from '@umbraco-cms/backoffice/backend-api'; export const handlers = [ rest.get(umbracoPath('/tag'), (_req, res, ctx) => { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/telemetry.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/telemetry.handlers.ts index 1f0d10a57f..0bcb4e5cfb 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/telemetry.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/telemetry.handlers.ts @@ -1,9 +1,10 @@ const { rest } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { +import type { PagedTelemetryResponseModel, - TelemetryResponseModel, + TelemetryResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { TelemetryLevelModel, } from '@umbraco-cms/backoffice/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template.handlers.ts index 004a90a662..2683a0a809 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template.handlers.ts @@ -1,7 +1,7 @@ const { rest } = window.MockServiceWorker; import { umbTemplateData } from '../data/template.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { CreateTemplateRequestModel, UpdateTemplateRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { CreateTemplateRequestModel, UpdateTemplateRequestModel } from '@umbraco-cms/backoffice/backend-api'; export const handlers = [ //#region TREE diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/tracked-reference.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/tracked-reference.handlers.ts index 5b3fa1324e..50cc66b1f0 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/tracked-reference.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/tracked-reference.handlers.ts @@ -1,7 +1,7 @@ import { items } from '../data/tracked-reference.data.js'; const { rest } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { PagedRelationItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { PagedRelationItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; export const handlers = [ rest.get(umbracoPath('/tracked-reference/:id'), (_req, res, ctx) => { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/tree-media.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/tree-media.handlers.ts deleted file mode 100644 index afb81d1196..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/tree-media.handlers.ts +++ /dev/null @@ -1,26 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { umbMediaData } from '../data/media.data.js'; - -// TODO: add schema -export const handlers = [ - rest.get('/umbraco/management/api/v1/tree/media/root', (req, res, ctx) => { - const response = umbMediaData.getTreeRoot(); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get('/umbraco/management/api/v1/tree/media/children', (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); - if (!parentId) return; - const response = umbMediaData.getTreeItemChildren(parentId); - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get('/umbraco/management/api/v1/tree/media/item', (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (!ids) return; - - const items = umbMediaData.getTreeItem(ids); - - return res(ctx.status(200), ctx.json(items)); - }), -]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/change-password.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/change-password.handlers.ts index 1c8bdb9a82..dcdcd307a8 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/change-password.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/change-password.handlers.ts @@ -1,6 +1,6 @@ const { rest } = window.MockServiceWorker; import { UMB_SLUG } from './slug.js'; -import { ChangePasswordUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { ChangePasswordUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts index 1ac22761ce..22b23d9cd4 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts @@ -1,7 +1,7 @@ const { rest } = window.MockServiceWorker; import { umbUsersData } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; -import { DisableUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { DisableUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts index 029d31ce63..046a286c54 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts @@ -1,7 +1,7 @@ const { rest } = window.MockServiceWorker; import { umbUsersData } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; -import { EnableUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { EnableUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts index 42e8ba2b2c..9682c2b81e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts @@ -1,7 +1,7 @@ const { rest } = window.MockServiceWorker; import { umbUsersData } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; -import { InviteUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { InviteUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; const inviteSlug = `${UMB_SLUG}/invite`; @@ -15,7 +15,13 @@ export const handlers = [ if (!userId) return res(ctx.status(400)); - return res(ctx.status(201), ctx.set('Location', userId)); + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + userId, + 'Umb-Generated-Resource': userId, + }), + ); }), rest.post(umbracoPath(`${inviteSlug}/resend`), async (req, res, ctx) => { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts index 1f9c4be73a..1d90b62f10 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts @@ -1,7 +1,7 @@ const { rest } = window.MockServiceWorker; import { umbUsersData } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; -import { UnlockUsersRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UnlockUsersRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts index 79796d6350..8077800026 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts @@ -1,8 +1,9 @@ import { UmbAuditLogServerDataSource } from './audit-log.server.data.js'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; -import { AuditTypeModel, DirectionModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbNotificationContext} from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { AuditTypeModel, DirectionModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; export class UmbAuditLogRepository extends UmbBaseController { @@ -14,7 +15,7 @@ export class UmbAuditLogRepository extends UmbBaseController { super(host); this.#dataSource = new UmbAuditLogServerDataSource(host); - this.#init = new UmbContextConsumerController(host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.#init = new UmbContextConsumerController(host, UMB_NOTIFICATION_CONTEXT, (instance) => { this.#notificationService = instance; }).asPromise(); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts index 7fbd256231..4bd800ac9b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts @@ -1,4 +1,5 @@ -import { AuditLogResource, DirectionModel, AuditTypeModel } from '@umbraco-cms/backoffice/backend-api'; +import type { DirectionModel, AuditTypeModel } from '@umbraco-cms/backoffice/backend-api'; +import { AuditLogResource } from '@umbraco-cms/backoffice/backend-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/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.element.ts index b13582061a..96a236e0e6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.element.ts @@ -1,5 +1,5 @@ import { html, customElement, property, css, state, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.stories.ts index 042a5422b9..c1155161ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-column-span/property-editor-ui-block-grid-column-span.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbPropertyEditorUIBlockGridColumnSpanElement } from './property-editor-ui-block-grid-column-span.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.ts index 220c67a819..fccea2bcf0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.element.ts @@ -1,108 +1,154 @@ -import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; -import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, property, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import type { UmbRoute, UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; -import { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { + UMB_BLOCK_CATALOGUE_MODAL, + type UmbBlockLayoutBaseModel, + type UmbBlockTypeBaseModel, + type UmbBlockTypeGroup, +} from '@umbraco-cms/backoffice/block'; +import { type UmbModalRouteBuilder, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; +import type { NumberRangeValueType } from '@umbraco-cms/backoffice/models'; +import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; /** * @element umb-property-editor-ui-block-grid */ @customElement('umb-property-editor-ui-block-grid') export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implements UmbPropertyEditorUiElement { + #catalogueModal: UmbModalRouteRegistrationController; + @property() value = ''; + @state() + private _limitMin?: number; + @state() + private _limitMax?: number; + + @state() + private _blocks?: Array; + + @state() + private _blockGroups?: Array; + + @state() + private _layouts: Array = []; + + @state() + private _catalogueRouteBuilder?: UmbModalRouteBuilder; + + @state() + private _directRoute?: string; + + @state() + private _createButtonLabel = this.localize.term('blockEditor_addBlock'); + @property({ attribute: false }) - public config?: UmbPropertyEditorConfigCollection; + public set config(config: UmbPropertyEditorConfigCollection | undefined) { + if (!config) return; - @state() - private _routes: UmbRoute[] = []; + const validationLimit = config.getValueByAlias('validationLimit'); - @state() - private _routerPath: string | undefined; + this._limitMin = validationLimit?.min; + this._limitMax = validationLimit?.max; - @state() - private _activePath: string | undefined; + this._blocks = config.getValueByAlias>('blocks') ?? []; + this._blockGroups = config.getValueByAlias>('blockGroups') ?? []; - @state() - private _variantId?: UmbVariantId; + const customCreateButtonLabel = config.getValueByAlias('createLabel'); + if (customCreateButtonLabel) { + this._createButtonLabel = customCreateButtonLabel; + } else if (this._blocks.length === 1) { + this._createButtonLabel = this.localize.term('blockEditor_addThis', [this._blocks[0].label]); + } + + //const useInlineEditingAsDefault = config.getValueByAlias('useInlineEditingAsDefault'); + + //this.#context.setInlineEditingMode(useInlineEditingAsDefault); + //config.useSingleBlockMode + //config.useLiveEditing + //config.useInlineEditingAsDefault + this.style.maxWidth = config.getValueByAlias('maxPropertyWidth') ?? ''; + + //this.#context.setEditorConfiguration(config); + } constructor() { super(); - this.consumeContext(UMB_PROPERTY_CONTEXT, (context) => { - this.observe(context?.variantId, (propertyVariantId) => { - this._variantId = propertyVariantId; - this.setupRoutes(); - }); + this.consumeContext(UMB_PROPERTY_CONTEXT, (propertyContext) => { + this.observe( + propertyContext?.alias, + (alias) => { + this.#catalogueModal.setUniquePathValue('propertyAlias', alias); + }, + 'observePropertyAlias', + ); }); - } - setupRoutes() { - this._routes = []; - if (this._variantId !== undefined) { - this._routes = [ - { - path: 'modal-1', - component: () => { - return import('./property-editor-ui-block-grid-inner-test.element.js'); + this.#catalogueModal = new UmbModalRouteRegistrationController(this, UMB_BLOCK_CATALOGUE_MODAL) + .addUniquePaths(['propertyAlias']) + .addAdditionalPath(':view/:index') + .onSetup((routingInfo) => { + const index = routingInfo.index ? parseInt(routingInfo.index) : -1; + return { + data: { + blocks: this._blocks ?? [], + blockGroups: this._blockGroups ?? [], + openClipboard: routingInfo.view === 'clipboard', + blockOriginData: { index: index }, }, - setup: (component) => { - if (component instanceof HTMLElement) { - (component as any).name = 'block-grid-1'; - } - }, - }, - { - path: 'modal-2', - component: () => { - return import('./property-editor-ui-block-grid-inner-test.element.js'); - }, - setup: (component) => { - if (component instanceof HTMLElement) { - (component as any).name = 'block-grid-2'; - } - }, - }, - ]; - } + }; + }) + .observeRouteBuilder((routeBuilder) => { + this._catalogueRouteBuilder = routeBuilder; + }); } render() { - return this._variantId - ? html`
- umb-property-editor-ui-block-grid, inner routing test: - - - - - - - { - this._routerPath = event.target.absoluteRouterPath; - }} - @change=${(event: UmbRouterSlotChangeEvent) => { - this._activePath = event.target.localActiveViewPath; - }}> - -
` - : 'loading...'; + if (this._blocks?.length === 1) { + const elementKey = this._blocks[0].contentElementTypeKey; + this._directRoute = + this._catalogueRouteBuilder?.({ view: 'create', index: -1 }) + 'modal/umb-modal-workspace/create/' + elementKey; + } + return html` + + + + + `; } - static styles = [UmbTextStyles]; + static styles = [ + UmbTextStyles, + css` + :host { + display: grid; + gap: 1px; + } + > div { + display: flex; + flex-direction: column; + align-items: stretch; + } + + uui-button-group { + padding-top: 1px; + display: grid; + grid-template-columns: 1fr auto; + } + `, + ]; } export default UmbPropertyEditorUIBlockGridElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.stories.ts index c8e7db4f35..a4aabbf7fe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-editor/property-editor-ui-block-grid.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbPropertyEditorUIBlockGridElement } from './property-editor-ui-block-grid.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/manifests.ts new file mode 100644 index 0000000000..7bb496f59d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/manifests.ts @@ -0,0 +1,13 @@ +import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifest: ManifestPropertyEditorUi = { + type: 'propertyEditorUi', + alias: 'Umb.PropertyEditorUi.BlockTypeGroupConfiguration', + name: 'Block Grid Group Configuration Property Editor UI', + js: () => import('./property-editor-ui-block-grid-group-configuration.element.js'), + meta: { + label: '', + icon: 'icon-box-alt', + group: 'common', + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.element.ts new file mode 100644 index 0000000000..333d2258ed --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.element.ts @@ -0,0 +1,56 @@ +import { html, customElement, property, css } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { UmbBlockGridGroupType } from '@umbraco-cms/backoffice/block'; + +@customElement('umb-property-editor-ui-block-grid-group-configuration') +export class UmbPropertyEditorUIBlockGridGroupConfigurationElement + extends UmbLitElement + implements UmbPropertyEditorUiElement +{ + private _value: Array = []; + + @property({ type: Array }) + public get value(): Array { + return this._value; + } + public set value(value: Array) { + this._value = value || []; + } + + @property({ attribute: false }) + public set config(config: UmbPropertyEditorConfigCollection | undefined) {} + + #addGroup() { + this.value = [...this._value, { name: 'Unnamed group', key: UmbId.new() }]; + this.dispatchEvent(new CustomEvent('property-value-change')); + } + + render() { + return html` + + ${this.localize.term('blockEditor_addBlockGroup')} + + `; + } + + static styles = [ + UmbTextStyles, + css` + uui-button { + display: block; + } + `, + ]; +} + +export default UmbPropertyEditorUIBlockGridGroupConfigurationElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-property-editor-ui-block-grid-group-configuration': UmbPropertyEditorUIBlockGridGroupConfigurationElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.stories.ts new file mode 100644 index 0000000000..c001579428 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-group-configuration/property-editor-ui-block-grid-group-configuration.stories.ts @@ -0,0 +1,15 @@ +import type { Meta, Story } from '@storybook/web-components'; +import type { UmbPropertyEditorUIBlockGridGroupConfigurationElement } from './property-editor-ui-block-grid-group-configuration.element.js'; +import { html } from '@umbraco-cms/backoffice/external/lit'; + +import './property-editor-ui-block-grid-group-configuration.element.js'; + +export default { + title: 'Property Editor UIs/Block Grid Group Configuration', + component: 'umb-property-editor-ui-block-grid-group-configuration', + id: 'umb-property-editor-ui-block-grid-group-configuration', +} as Meta; + +export const AAAOverview: Story = () => + html` `; +AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.element.ts index f463ed3865..7636cf6ad1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.element.ts @@ -1,10 +1,10 @@ // Needed to disable the import/no-duplicates rule, cause otherwise we do not get the custom element registered: // eslint-disable-next-line import/no-duplicates -import { UmbInputStaticFileElement } from '@umbraco-cms/backoffice/static-file'; +import type { UmbInputStaticFileElement } from '@umbraco-cms/backoffice/static-file'; // eslint-disable-next-line import/no-duplicates import '@umbraco-cms/backoffice/static-file'; import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.stories.ts index 80e62120ce..e3293251d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-layout-stylesheet/property-editor-ui-block-grid-layout-stylesheet.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbPropertyEditorUIBlockGridLayoutStylesheetElement } from './property-editor-ui-block-grid-layout-stylesheet.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-type-configuration/property-editor-ui-block-grid-type-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-type-configuration/property-editor-ui-block-grid-type-configuration.element.ts index 94be84645b..9714e9cd08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-type-configuration/property-editor-ui-block-grid-type-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-type-configuration/property-editor-ui-block-grid-type-configuration.element.ts @@ -1,10 +1,21 @@ -import type { UmbBlockTypeBase, UmbInputBlockTypeElement } from '../../../block-type/index.js'; +import type { UmbBlockTypeWithGroupKey, UmbInputBlockTypeElement } from '../../../block-type/index.js'; import '../../../block-type/components/input-block-type/index.js'; -import { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; -import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; +import { html, customElement, property, state, repeat, nothing, css } from '@umbraco-cms/backoffice/external/lit'; +import { + UmbPropertyValueChangeEvent, + type UmbPropertyEditorConfigCollection, +} from '@umbraco-cms/backoffice/property-editor'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { + UMB_BLOCK_GRID_TYPE, + type UmbBlockGridGroupType, + type UmbBlockGridGroupTypeConfiguration, +} from '@umbraco-cms/backoffice/block'; +import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UMB_PROPERTY_DATASET_CONTEXT, type UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; /** * @element umb-property-editor-ui-block-grid-type-configuration @@ -14,22 +25,150 @@ export class UmbPropertyEditorUIBlockGridTypeConfigurationElement extends UmbLitElement implements UmbPropertyEditorUiElement { + #datasetContext?: UmbPropertyDatasetContext; + #blockTypeWorkspaceModalRegistration?: UmbModalRouteRegistrationController< + typeof UMB_WORKSPACE_MODAL.DATA, + typeof UMB_WORKSPACE_MODAL.VALUE + >; + + private _value: Array = []; @property({ attribute: false }) - value: UmbBlockTypeBase[] = []; + get value() { + return this._value; + } + set value(value: Array) { + this._value = value ?? []; + } @property({ type: Object, attribute: false }) public config?: UmbPropertyEditorConfigCollection; - render() { - return html` { - this.value = (e.target as UmbInputBlockTypeElement).value; - }}>`; + @state() + private _blockGroups: Array = []; + + @state() + private _mappedValuesAndGroups: Array = []; + + @state() + private _workspacePath?: string; + + constructor() { + super(); + this.consumeContext(UMB_PROPERTY_DATASET_CONTEXT, async (instance) => { + this.#datasetContext = instance; + this.#observeProperties(); + }); + + this.#blockTypeWorkspaceModalRegistration?.destroy(); + + this.#blockTypeWorkspaceModalRegistration = new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + .addAdditionalPath(UMB_BLOCK_GRID_TYPE) + .onSetup(() => { + return { data: { entityType: UMB_BLOCK_GRID_TYPE, preset: {} }, modal: { size: 'large' } }; + }) + .observeRouteBuilder((routeBuilder) => { + const newpath = routeBuilder({}); + this._workspacePath = newpath; + }); } - static styles = [UmbTextStyles]; + async #observeProperties() { + if (!this.#datasetContext) return; + + this.observe(await this.#datasetContext.propertyValueByAlias('blockGroups'), (value) => { + this._blockGroups = (value as Array) ?? []; + this.#mapValuesToBlockGroups(); + }); + this.observe(await this.#datasetContext.propertyValueByAlias('blocks'), () => { + this.#mapValuesToBlockGroups(); + }); + } + + #mapValuesToBlockGroups() { + // What if a block is in a group that does not exist in the block groups? Should it be removed? (Right now they will never be rendered) + const valuesWithNoGroup = this._value.filter((value) => !value.groupKey); + + const valuesWithGroup = this._blockGroups.map((group) => { + return { name: group.name, key: group.key, blocks: this._value.filter((value) => value.groupKey === group.key) }; + }); + + this._mappedValuesAndGroups = [{ blocks: valuesWithNoGroup }, ...valuesWithGroup]; + } + + #onChange(e: CustomEvent, groupKey?: string) { + const updatedValues = (e.target as UmbInputBlockTypeElement).value.map((value) => ({ ...value, groupKey })); + const filteredValues = this.value.filter((value) => value.groupKey !== groupKey); + this.value = [...filteredValues, ...updatedValues]; + this.dispatchEvent(new UmbPropertyValueChangeEvent()); + } + + #onCreate(e: CustomEvent, groupKey: string | null) { + const selectedElementType = e.detail.contentElementTypeKey; + if (selectedElementType) { + this.#blockTypeWorkspaceModalRegistration?.open({}, 'create/' + selectedElementType + '/' + groupKey); + } + } + + #deleteGroup(groupKey: string) { + this.#datasetContext?.setPropertyValue( + 'blockGroups', + this._blockGroups.filter((group) => group.key !== groupKey), + ); + + // Should blocks that belonged to the removed group be deleted as well? + this.value = this._value.filter((block) => block.groupKey !== groupKey); + } + + #changeGroupName(e: UUIInputEvent, groupKey: string) { + const groupName = e.target.value as string; + this.#datasetContext?.setPropertyValue( + 'blockGroups', + this._blockGroups.map((group) => (group.key === groupKey ? { ...group, name: groupName } : group)), + ); + } + + render() { + return html`${repeat( + this._mappedValuesAndGroups, + (group) => group.key, + (group) => + html`${group.key ? this.#renderGroupInput(group.key, group.name) : nothing} + this.#onCreate(e, group.key ?? null)} + @change=${(e: CustomEvent) => this.#onChange(e, group.key)}>`, + )}`; + } + + #renderGroupInput(groupKey: string, groupName?: string) { + return html` this.#changeGroupName(e, groupKey)}> + this.#deleteGroup(groupKey)}> + + + `; + } + + static styles = [ + UmbTextStyles, + css` + uui-input { + margin-top: var(--uui-size-6); + margin-bottom: var(--uui-size-4); + } + + uui-input:not(:hover, :focus) { + border: 1px solid transparent; + } + uui-input:not(:hover, :focus) uui-button { + opacity: 0; + } + `, + ]; } export default UmbPropertyEditorUIBlockGridTypeConfigurationElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-type-configuration/property-editor-ui-block-grid-type-configuration.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-type-configuration/property-editor-ui-block-grid-type-configuration.stories.ts index 8afc18f439..5f8d2943d3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-type-configuration/property-editor-ui-block-grid-type-configuration.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-type-configuration/property-editor-ui-block-grid-type-configuration.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbPropertyEditorUIBlockGridTypeConfigurationElement } from './property-editor-ui-block-grid-type-configuration.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/manifests.ts index 11b3d055ed..f1737b0acd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/manifests.ts @@ -2,5 +2,12 @@ import { manifest as blockGridEditor } from './block-grid-editor/manifests.js'; import { manifest as blockGridLayoutStylesheet } from './block-grid-layout-stylesheet/manifests.js'; import { manifest as blockGridTypeConfiguration } from './block-grid-type-configuration/manifests.js'; import { manifest as blockGridColumnSpan } from './block-grid-column-span/manifests.js'; +import { manifest as blockGridGroupConfiguration } from './block-grid-group-configuration/manifests.js'; -export const manifests = [blockGridTypeConfiguration, blockGridEditor, blockGridLayoutStylesheet, blockGridColumnSpan]; +export const manifests = [ + blockGridTypeConfiguration, + blockGridEditor, + blockGridLayoutStylesheet, + blockGridColumnSpan, + blockGridGroupConfiguration, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/types.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/types.ts index 1a58b9ea39..3a51638811 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/types.ts @@ -1,6 +1,8 @@ -import type { UmbBlockTypeBase } from '../block-type/index.js'; +import type { UmbBlockTypeBaseModel, UmbBlockTypeWithGroupKey } from '../block-type/index.js'; -export interface UmbBlockGridType extends UmbBlockTypeBase { +export const UMB_BLOCK_GRID_TYPE = 'block-grid-type'; + +export interface UmbBlockGridType extends UmbBlockTypeBaseModel { columnSpanOptions: Array; allowAtRoot: boolean; allowInAreas: boolean; @@ -9,5 +11,13 @@ export interface UmbBlockGridType extends UmbBlockTypeBase { thumbnail?: string; areaGridColumns?: number; areas: Array; - groupKey: null | string; +} + +export interface UmbBlockGridGroupType { + name: string; + key: string; +} + +export interface UmbBlockGridGroupTypeConfiguration extends Partial { + blocks: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-workspace.modal-token.ts new file mode 100644 index 0000000000..6cbd004c75 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-workspace.modal-token.ts @@ -0,0 +1,21 @@ +import type { UmbBlockWorkspaceData } from '../../index.js'; +import type { UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbBlockGridWorkspaceData + extends UmbBlockWorkspaceData<{ + index: number; + parentId: string | null; + }> {} + +export const UMB_BLOCK_GRID_WORKSPACE_MODAL = new UmbModalToken( + 'Umb.Modal.Workspace', + { + modal: { + type: 'sidebar', + size: 'medium', + }, + data: { entityType: 'block', preset: {}, originData: { index: -1, parentId: null } }, + // Recast the type, so the entityType data prop is not required: + }, +) as UmbModalToken, UmbWorkspaceValue>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/index.ts index ff371a313e..e94538cd86 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/index.ts @@ -1 +1,2 @@ export const UMB_BLOCK_GRID_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.BlockGridType'; +export * from './block-grid-workspace.modal-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-advanced.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-advanced.element.ts index 9bd15e469d..ca143ac5d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-advanced.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-advanced.element.ts @@ -1,7 +1,7 @@ import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-block-grid-type-workspace-view-advanced') export class UmbBlockGridTypeWorkspaceViewAdvancedElement extends UmbLitElement implements UmbWorkspaceViewElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-areas.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-areas.element.ts index 11ea473f94..2baf5dee99 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-areas.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-areas.element.ts @@ -1,7 +1,7 @@ import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-block-grid-type-workspace-view-areas') export class UmbBlockGridTypeWorkspaceViewAreasElement extends UmbLitElement implements UmbWorkspaceViewElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-settings.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-settings.element.ts index 776355bc99..d876f8a842 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-settings.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/block-grid-type-workspace-view-settings.element.ts @@ -1,9 +1,9 @@ import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; -import { UmbInputNumberRangeElement } from '@umbraco-cms/backoffice/components'; +import type { UmbInputNumberRangeElement } from '@umbraco-cms/backoffice/components'; import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/data-type'; @customElement('umb-block-grid-type-workspace-view') diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/block-list-block/block-list-block.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/block-list-block/block-list-block.element.ts index 8c10939823..897f888b4c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/block-list-block/block-list-block.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/block-list-block/block-list-block.element.ts @@ -1,10 +1,11 @@ +import { UmbBlockListContext } from '../../context/block-list.context.js'; import { html, css, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { type UmbBlockLayoutBaseModel } from '@umbraco-cms/backoffice/block'; +import type { UmbBlockLayoutBaseModel } from '@umbraco-cms/backoffice/block'; import '../ref-list-block/index.js'; -import { UmbBlockContext } from '@umbraco-cms/backoffice/block'; -import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import '../inline-list-block/index.js'; +import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; /** * @element umb-property-editor-ui-block-list-block @@ -22,28 +23,56 @@ export class UmbPropertyEditorUIBlockListBlockElement extends UmbLitElement impl } private _layout?: UmbBlockLayoutBaseModel | undefined; - #context = new UmbBlockContext(this); + #context = new UmbBlockListContext(this); + + @state() + _contentUdi?: string; + + @state() + _hasSettings = false; @state() _label = ''; + @state() + _workspaceEditPath?: string; + + @state() + _inlineEditingMode?: boolean; + + // TODO: Move type for the Block Properties, and use it on the Element Interface for the Manifest. + @state() + _blockViewProps: { + label?: string; + } = {}; + constructor() { super(); + this.observe(this.#context.workspaceEditPath, (workspaceEditPath) => { + this._workspaceEditPath = workspaceEditPath; + }); + this.observe(this.#context.contentUdi, (contentUdi) => { + this._contentUdi = contentUdi; + }); + this.observe(this.#context.blockTypeSettingsElementTypeKey, (blockTypeSettingsElementTypeKey) => { + this._hasSettings = !!blockTypeSettingsElementTypeKey; + }); this.observe(this.#context.label, (label) => { + this._blockViewProps.label = label; this._label = label; }); - this.observe(this.#context.layout, (layout) => { - console.log('layout', layout); + this.observe(this.#context.inlineEditingMode, (inlineEditingMode) => { + this._inlineEditingMode = inlineEditingMode; }); } #requestDelete() { - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, async (modalManager) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, async (modalManager) => { const modalContext = modalManager.open(UMB_CONFIRM_MODAL, { data: { headline: `Delete ${this._label}`, - content: 'Are you sure you want to delete this block?', + content: 'Are you sure you want to delete this [INSERT BLOCK TYPE NAME]?', confirmLabel: 'Delete', color: 'danger', }, @@ -54,17 +83,32 @@ export class UmbPropertyEditorUIBlockListBlockElement extends UmbLitElement impl } #renderRefBlock() { - return html` `; + return html``; } - /*#renderInlineBlock() { - return html``; - }*/ + #renderInlineBlock() { + return html``; + } #renderBlock() { return html` - ${this.#renderRefBlock()} + ${this._inlineEditingMode ? this.#renderInlineBlock() : this.#renderRefBlock()} + ${this._workspaceEditPath + ? html` + + ` + : ''} + ${this._workspaceEditPath && this._hasSettings + ? html` + + ` + : ''} @@ -73,7 +117,7 @@ export class UmbPropertyEditorUIBlockListBlockElement extends UmbLitElement impl } render() { - return this.layout ? this.#renderBlock() : ''; + return this.layout && this._contentUdi ? this.#renderBlock() : ''; } static styles = [ @@ -84,10 +128,13 @@ export class UmbPropertyEditorUIBlockListBlockElement extends UmbLitElement impl } uui-action-bar { position: absolute; - top: 50%; - transform: translateY(-50%); + top: var(--uui-size-2); right: var(--uui-size-2); } + + :host([drag-placeholder]) { + opacity: 0.2; + } `, ]; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/inline-list-block/inline-list-block.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/inline-list-block/inline-list-block.element.ts index 542de5c0a7..e177087318 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/inline-list-block/inline-list-block.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/inline-list-block/inline-list-block.element.ts @@ -1,14 +1,98 @@ -import { customElement } from '@umbraco-cms/backoffice/external/lit'; +import { UMB_BLOCK_LIST_CONTEXT } from '../../index.js'; +import type { UMB_BLOCK_WORKSPACE_CONTEXT } from '../../../block/index.js'; +import { UMB_BLOCK_WORKSPACE_ALIAS } from '../../../block/index.js'; +import { UmbExtensionsApiInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { css, customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import '../../../block/workspace/views/edit/block-workspace-view-edit-no-router.element.js'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; /** * @element umb-inline-list-block */ @customElement('umb-inline-list-block') export class UmbInlineListBlockElement extends UmbLitElement { - render() { - return 'inline mode..'; + #blockContext?: typeof UMB_BLOCK_LIST_CONTEXT.TYPE; + #workspaceContext?: typeof UMB_BLOCK_WORKSPACE_CONTEXT.TYPE; + #contentUdi?: string; + + @property({ type: String }) + label?: string; + + @state() + _isOpen = false; + + constructor() { + super(); + + this.consumeContext(UMB_BLOCK_LIST_CONTEXT, (blockContext) => { + this.#blockContext = blockContext; + this.observe( + this.#blockContext.contentUdi, + (contentUdi) => { + this.#contentUdi = contentUdi; + this.#load(); + }, + 'observeContentUdi', + ); + }); + this.observe(umbExtensionsRegistry.getByTypeAndAlias('workspace', UMB_BLOCK_WORKSPACE_ALIAS), (manifest) => { + if (manifest) { + createExtensionApi(manifest, [this, { manifest: manifest }]).then((context) => { + if (context) { + this.#workspaceContext = context as typeof UMB_BLOCK_WORKSPACE_CONTEXT.TYPE; + this.#load(); + this.#workspaceContext.content.createPropertyDatasetContext(this); + + new UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'workspaceContext', [ + this, + this.#workspaceContext, + ]); + } + }); + } + }); } + + #load() { + if (!this.#workspaceContext || !this.#contentUdi) return; + this.#workspaceContext.load(this.#contentUdi); + } + + render() { + return html` + + ${this._isOpen === true + ? html`` + : ''} + `; + } + + static styles = [ + UmbTextStyles, + css` + #accordion-button { + display: flex; + text-align: left; + align-items: center; + justify-content: flex-start; + width: 100%; + border: none; + background: none; + padding: 0; + } + `, + ]; } export default UmbInlineListBlockElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/ref-list-block/ref-list-block.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/ref-list-block/ref-list-block.element.ts index e261b37d3d..dce78e9855 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/ref-list-block/ref-list-block.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/components/ref-list-block/ref-list-block.element.ts @@ -1,16 +1,45 @@ -import { customElement } from '@umbraco-cms/backoffice/external/lit'; -import { UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; +import { UMB_BLOCK_LIST_CONTEXT } from '../../context/block-list.context-token.js'; +import { css, customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-ref-list-block */ @customElement('umb-ref-list-block') -export class UmbRefListBlockElement extends UUIRefNodeElement { +export class UmbRefListBlockElement extends UmbLitElement { // - connectedCallback(): void { - super.connectedCallback(); - this.setAttribute('border', ''); + @property({ type: String }) + label?: string; + + @state() + _workspaceEditPath?: string; + + constructor() { + super(); + + this.consumeContext(UMB_BLOCK_LIST_CONTEXT, (context) => { + this.observe( + context.workspaceEditPath, + (workspaceEditPath) => { + this._workspaceEditPath = workspaceEditPath; + }, + 'observeWorkspaceEditPath', + ); + }); } + + render() { + // href=${this._workspaceEditPath ?? '#'} + return html``; + } + + static styles = [ + css` + uui-ref-node { + min-height: var(--uui-size-16); + } + `, + ]; } export default UmbRefListBlockElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list.context-token.ts new file mode 100644 index 0000000000..f5ac6af1ec --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list.context-token.ts @@ -0,0 +1,4 @@ +import type { UmbBlockListContext } from './block-list.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_BLOCK_LIST_CONTEXT = new UmbContextToken('UmbBlockContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list.context.ts new file mode 100644 index 0000000000..60b2c3b4c3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/context/block-list.context.ts @@ -0,0 +1,30 @@ +import { UMB_BLOCK_LIST_MANAGER_CONTEXT } from '../manager/block-list-manager.context.js'; +import { UmbBlockContext } from '@umbraco-cms/backoffice/block'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; +export class UmbBlockListContext extends UmbBlockContext< + typeof UMB_BLOCK_LIST_MANAGER_CONTEXT, + typeof UMB_BLOCK_LIST_MANAGER_CONTEXT.TYPE +> { + #inlineEditingMode = new UmbBooleanState(undefined); + inlineEditingMode = this.#inlineEditingMode.asObservable(); + + constructor(host: UmbControllerHost) { + super(host, UMB_BLOCK_LIST_MANAGER_CONTEXT); + } + + _gotManager() { + super._gotManager(); + if (this._manager) { + this.observe( + this._manager.inlineEditingMode, + (inlineEditingMode) => { + this.#inlineEditingMode.setValue(inlineEditingMode); + }, + 'observeInlineEditingMode', + ); + } else { + this.removeControllerByAlias('observeInlineEditingMode'); + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/index.ts index 60f06132a7..06bff7c73b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/index.ts @@ -1 +1,2 @@ export * from './workspace/index.js'; +export * from './context/block-list.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/manager/block-list-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/manager/block-list-manager.context.ts new file mode 100644 index 0000000000..265645fe82 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/manager/block-list-manager.context.ts @@ -0,0 +1,33 @@ +import type { UmbBlockListLayoutModel, UmbBlockListTypeModel } from '../types.js'; +import { UmbBlockManagerContext } from '../../block/manager/block-manager.context.js'; +import type { UmbBlockListWorkspaceData } from '../index.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; + +/** + * A implementation of the Block Manager specifically for the Block List. + */ +export class UmbBlockListManagerContext< + BlockLayoutType extends UmbBlockListLayoutModel = UmbBlockListLayoutModel, +> extends UmbBlockManagerContext { + // + #inlineEditingMode = new UmbBooleanState(undefined); + inlineEditingMode = this.#inlineEditingMode.asObservable(); + + setInlineEditingMode(inlineEditingMode: boolean | undefined) { + this.#inlineEditingMode.setValue(inlineEditingMode ?? false); + } + + _createBlock(modalData: UmbBlockListWorkspaceData, layoutEntry: BlockLayoutType, contentElementTypeKey: string) { + // Here is room to append some extra layout properties if needed for this type. + + this._layouts.appendOneAt(layoutEntry, modalData.originData.index ?? -1); + + return true; + } +} + +export const UMB_BLOCK_LIST_MANAGER_CONTEXT = new UmbContextToken< + UmbBlockListManagerContext, + UmbBlockListManagerContext +>('UmbBlockManagerContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts index 19250cef57..f8671c248d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.element.ts @@ -1,31 +1,53 @@ +import { UmbBlockListManagerContext } from '../../manager/block-list-manager.context.js'; +import '../../components/block-list-block/index.js'; +import type { UmbPropertyEditorUIBlockListBlockElement } from '../../components/block-list-block/index.js'; import { UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS } from './manifests.js'; -import { html, customElement, property, state, repeat, css, nothing } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, property, state, repeat, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; -import { - UMB_BLOCK_CATALOGUE_MODAL, - UmbBlockLayoutBaseModel, - UmbBlockManagerContext, - UmbBlockTypeBase, - type UmbBlockValueType, -} from '@umbraco-cms/backoffice/block'; -import '../../components/block-list-block/index.js'; -import { buildUdi } from '@umbraco-cms/backoffice/utils'; -import { UmbId } from '@umbraco-cms/backoffice/id'; +import { UMB_BLOCK_CATALOGUE_MODAL } from '@umbraco-cms/backoffice/block'; +import type { UmbBlockLayoutBaseModel, UmbBlockTypeBaseModel, UmbBlockValueType } from '@umbraco-cms/backoffice/block'; import type { NumberRangeValueType } from '@umbraco-cms/backoffice/models'; -import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import type { UmbModalRouteBuilder } from '@umbraco-cms/backoffice/modal'; +import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbSorterConfig } from '@umbraco-cms/backoffice/sorter'; +import { UmbSorterController } from '@umbraco-cms/backoffice/sorter'; +import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; export interface UmbBlockListLayoutModel extends UmbBlockLayoutBaseModel {} export interface UmbBlockListValueModel extends UmbBlockValueType {} +const SORTER_CONFIG: UmbSorterConfig = { + getUniqueOfElement: (element) => { + return element.getAttribute('data-udi'); + }, + getUniqueOfModel: (modelEntry) => { + return modelEntry.contentUdi; + }, + identifier: 'block-list-editor', + itemSelector: 'umb-property-editor-ui-block-list-block', + //containerSelector: 'EMPTY ON PURPOSE, SO IT BECOMES THE HOST ELEMENT', +}; + /** * @element umb-property-editor-ui-block-list */ @customElement('umb-property-editor-ui-block-list') export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implements UmbPropertyEditorUiElement { + // + #sorter = new UmbSorterController(this, { + ...SORTER_CONFIG, + onChange: ({ model }) => { + this.#context.setLayouts(model); + }, + }); + + #catalogueModal: UmbModalRouteRegistrationController; + private _value: UmbBlockListValueModel = { layout: {}, contentData: [], @@ -37,7 +59,7 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement return this._value; } public set value(value: UmbBlockListValueModel | undefined) { - const buildUpValue: Partial = value ?? {}; + const buildUpValue: Partial = value ? { ...value } : {}; buildUpValue.layout ??= {}; buildUpValue.contentData ??= []; buildUpValue.settingsData ??= []; @@ -48,20 +70,36 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement this.#context.setSettings(buildUpValue.settingsData); } + @state() + private _createButtonLabel = this.localize.term('content_createEmpty'); + @property({ attribute: false }) public set config(config: UmbPropertyEditorConfigCollection | undefined) { if (!config) return; + const validationLimit = config.getValueByAlias('validationLimit'); this._limitMin = validationLimit?.min; this._limitMax = validationLimit?.max; - const blocks = config.getValueByAlias>('blocks') ?? []; + const blocks = config.getValueByAlias>('blocks') ?? []; this.#context.setBlockTypes(blocks); + + const customCreateButtonLabel = config.getValueByAlias('createLabel'); + if (customCreateButtonLabel) { + this._createButtonLabel = customCreateButtonLabel; + } else if (blocks.length === 1) { + this._createButtonLabel = `${this.localize.term('general_add')} ${blocks[0].label}`; + } + + const useInlineEditingAsDefault = config.getValueByAlias('useInlineEditingAsDefault'); + this.#context.setInlineEditingMode(useInlineEditingAsDefault); //config.useSingleBlockMode //config.useLiveEditing //config.useInlineEditingAsDefault this.style.maxWidth = config.getValueByAlias('maxPropertyWidth') ?? ''; + + this.#context.setEditorConfiguration(config); } @state() @@ -70,93 +108,101 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement private _limitMax?: number; @state() - private _blocks?: Array; - - #context = new UmbBlockManagerContext(this); + private _blocks?: Array; @state() - _layouts: Array = []; + private _layouts: Array = []; - #modalContext?: UmbModalManagerContext; + @state() + private _catalogueRouteBuilder?: UmbModalRouteBuilder; + + @state() + private _directRoute?: string; + + #context = new UmbBlockListManagerContext(this); constructor() { super(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { - this.#modalContext = instance; + this.consumeContext(UMB_PROPERTY_CONTEXT, (propertyContext) => { + this.observe( + propertyContext?.alias, + (alias) => { + this.#catalogueModal.setUniquePathValue('propertyAlias', alias); + }, + 'observePropertyAlias', + ); }); // TODO: Prevent initial notification from these observes: this.observe(this.#context.layouts, (layouts) => { - this._value.layout[UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS] = layouts; + this._value = { ...this._value, layout: { [UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS]: layouts } }; // Notify that the value has changed. //console.log('layout changed', this._value); - // TODO: idea: consider inserting an await here, so other changes could appear first? Maybe some mechanism to only fire change event onces? this._layouts = layouts; + this.#sorter.setModel(layouts); + this.dispatchEvent(new UmbChangeEvent()); }); this.observe(this.#context.contents, (contents) => { - this._value.contentData = contents; + this._value = { ...this._value, contentData: contents }; // Notify that the value has changed. //console.log('content changed', this._value); + this.dispatchEvent(new UmbChangeEvent()); }); this.observe(this.#context.settings, (settings) => { - this._value.settingsData = settings; + this._value = { ...this._value, settingsData: settings }; // Notify that the value has changed. //console.log('settings changed', this._value); + this.dispatchEvent(new UmbChangeEvent()); }); this.observe(this.#context.blockTypes, (blockTypes) => { this._blocks = blockTypes; }); - } - async #openBlockCatalogue(openClipboard: boolean = false) { - //Open modal - const modalContext = this.#modalContext?.open(UMB_BLOCK_CATALOGUE_MODAL, { - data: { blocks: this._blocks ?? [], openClipboard }, - }); - - const data = await modalContext?.onSubmit(); - - /**TODO: Insert next modal for data */ - console.log('submitted', data); - - if (!data) return; - - const block = this._blocks?.find((x) => x.contentElementTypeKey === data.key); - - if (!block?.contentElementTypeKey) return; - - this.#context.createBlock( - { - contentUdi: buildUdi('element', UmbId.new()), - settingsUdi: buildUdi('element', UmbId.new()), - }, - block.contentElementTypeKey, - ); + this.#catalogueModal = new UmbModalRouteRegistrationController(this, UMB_BLOCK_CATALOGUE_MODAL) + .addUniquePaths(['propertyAlias']) + .addAdditionalPath(':view/:index') + .onSetup((routingInfo) => { + const index = routingInfo.index ? parseInt(routingInfo.index) : -1; + return { + data: { + blocks: this._blocks ?? [], + openClipboard: routingInfo.view === 'clipboard', + blockOriginData: { index: index }, + }, + }; + }) + .observeRouteBuilder((routeBuilder) => { + this._catalogueRouteBuilder = routeBuilder; + }); } render() { + if (this._blocks?.length === 1) { + const elementKey = this._blocks[0].contentElementTypeKey; + this._directRoute = + this._catalogueRouteBuilder?.({ view: 'create', index: -1 }) + 'modal/umb-modal-workspace/create/' + elementKey; + } return html` ${repeat( this._layouts, (x) => x.contentUdi, - (layoutEntry) => - html` - + (layoutEntry, index) => + html` + `, )} this.#openBlockCatalogue()}> - ${this.localize.term('content_createEmpty')} - + label=${this._createButtonLabel} + href=${this._directRoute ?? this._catalogueRouteBuilder?.({ view: 'create', index: -1 }) ?? ''}> this.#openBlockCatalogue(true)}> + href=${this._catalogueRouteBuilder?.({ view: 'clipboard', index: -1 }) ?? ''}> `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.stories.ts index e1fb4b9cc3..c01418b7c5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/property-editor-ui-block-list.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbPropertyEditorUIBlockListElement } from './property-editor-ui-block-list.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-type-configuration/property-editor-ui-block-list-type-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-type-configuration/property-editor-ui-block-list-type-configuration.element.ts index 492d316425..a1a1c7de07 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-type-configuration/property-editor-ui-block-list-type-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-type-configuration/property-editor-ui-block-list-type-configuration.element.ts @@ -1,10 +1,12 @@ -import type { UmbBlockTypeBase, UmbInputBlockTypeElement } from '../../../block-type/index.js'; +import type { UmbBlockTypeBaseModel, UmbInputBlockTypeElement } from '../../../block-type/index.js'; import '../../../block-type/components/input-block-type/index.js'; -import { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; -import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import { UMB_BLOCK_LIST_TYPE } from '../../types.js'; +import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; +import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; /** * @element umb-property-editor-ui-block-list-type-configuration @@ -14,16 +16,47 @@ export class UmbPropertyEditorUIBlockListBlockConfigurationElement extends UmbLitElement implements UmbPropertyEditorUiElement { + #blockTypeWorkspaceModalRegistration?: UmbModalRouteRegistrationController< + typeof UMB_WORKSPACE_MODAL.DATA, + typeof UMB_WORKSPACE_MODAL.VALUE + >; + + @state() + private _workspacePath?: string; + + constructor() { + super(); + this.#blockTypeWorkspaceModalRegistration?.destroy(); + + this.#blockTypeWorkspaceModalRegistration = new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + .addAdditionalPath(UMB_BLOCK_LIST_TYPE) + .onSetup(() => { + return { data: { entityType: UMB_BLOCK_LIST_TYPE, preset: {} }, modal: { size: 'large' } }; + }) + .observeRouteBuilder((routeBuilder) => { + const newpath = routeBuilder({}); + this._workspacePath = newpath; + }); + } + @property({ attribute: false }) - value: UmbBlockTypeBase[] = []; + value: UmbBlockTypeBaseModel[] = []; @property({ type: Object, attribute: false }) public config?: UmbPropertyEditorConfigCollection; + #onCreate(e: CustomEvent) { + const selectedElementType = e.detail.contentElementTypeKey; + if (selectedElementType) { + this.#blockTypeWorkspaceModalRegistration?.open({}, 'create/' + selectedElementType + '/null'); + } + } + render() { return html` { this.value = (e.target as UmbInputBlockTypeElement).value; }}>`; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-type-configuration/property-editor-ui-block-list-type-configuration.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-type-configuration/property-editor-ui-block-list-type-configuration.stories.ts index 4e75dbdefe..edaff94f9d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-type-configuration/property-editor-ui-block-list-type-configuration.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-type-configuration/property-editor-ui-block-list-type-configuration.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbPropertyEditorUIBlockListBlockConfigurationElement } from './property-editor-ui-block-list-type-configuration.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/types.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/types.ts new file mode 100644 index 0000000000..bd1e8053c9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/types.ts @@ -0,0 +1,7 @@ +import type { UmbBlockTypeBaseModel } from '../block-type/index.js'; +import type { UmbBlockLayoutBaseModel } from '../index.js'; + +export const UMB_BLOCK_LIST_TYPE = 'block-list-type'; + +export interface UmbBlockListTypeModel extends UmbBlockTypeBaseModel {} +export interface UmbBlockListLayoutModel extends UmbBlockLayoutBaseModel {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/block-list-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/block-list-workspace.modal-token.ts new file mode 100644 index 0000000000..f6d83891b9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/block-list-workspace.modal-token.ts @@ -0,0 +1,20 @@ +import type { UmbBlockWorkspaceData } from '../../index.js'; +import type { UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbBlockListWorkspaceData + extends UmbBlockWorkspaceData<{ + index: number; + }> {} + +export const UMB_BLOCK_LIST_WORKSPACE_MODAL = new UmbModalToken( + 'Umb.Modal.Workspace', + { + modal: { + type: 'sidebar', + size: 'medium', + }, + data: { entityType: 'block', preset: {}, originData: { index: -1 } }, + // Recast the type, so the entityType data prop is not required: + }, +) as UmbModalToken, UmbWorkspaceValue>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/index.ts index b4685e9690..3aef41c3bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/index.ts @@ -1 +1,2 @@ export const UMB_BLOCK_LIST_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.BlockListType'; +export * from './block-list-workspace.modal-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/views/block-list-type-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/views/block-list-type-workspace-view.element.ts index 14e8adac23..84efd3766d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/views/block-list-type-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/views/block-list-type-workspace-view.element.ts @@ -1,7 +1,7 @@ import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-block-list-type-workspace-view-settings') export class UmbBlockListTypeWorkspaceViewSettingsElement extends UmbLitElement implements UmbWorkspaceViewElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/block-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/block-manager.context.ts deleted file mode 100644 index 8303e6c1b8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/block-manager.context.ts +++ /dev/null @@ -1,148 +0,0 @@ -import type { UmbBlockTypeBase } from '../block-type/types.js'; -import type { UmbBlockLayoutBaseModel, UmbBlockDataType } from './types.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type'; -import { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { getKeyFromUdi } from '@umbraco-cms/backoffice/utils'; - -// TODO: We are using backend model here, I think we should get our own model: -type ElementTypeModel = DocumentTypeResponseModel; - -export class UmbBlockManagerContext< - BlockType extends UmbBlockTypeBase = UmbBlockTypeBase, - BlockLayoutType extends UmbBlockLayoutBaseModel = UmbBlockLayoutBaseModel, -> extends UmbContextBase { - // - #contentTypeRepository = new UmbDocumentTypeDetailRepository(this); - - #contentTypes = new UmbArrayState(>[], (x) => x.id); - public readonly contentTypes = this.#contentTypes.asObservable(); - - #blockTypes = new UmbArrayState(>[], (x) => x.contentElementTypeKey); - public readonly blockTypes = this.#blockTypes.asObservable(); - - #layouts = new UmbArrayState(>[], (x) => x.contentUdi); - public readonly layouts = this.#layouts.asObservable(); - - #contents = new UmbArrayState(>[], (x) => x.udi); - public readonly contents = this.#contents.asObservable(); - - #settings = new UmbArrayState(>[], (x) => x.udi); - public readonly settings = this.#settings.asObservable(); - - setBlockTypes(blockTypes: Array) { - this.#blockTypes.next(blockTypes); - } - getBlockTypes() { - return this.#blockTypes.value; - } - - setLayouts(layouts: Array) { - this.#layouts.next(layouts); - } - - setContents(contents: Array) { - this.#contents.next(contents); - } - setSettings(settings: Array) { - this.#settings.next(settings); - } - - constructor(host: UmbControllerHost) { - super(host, UMB_BLOCK_MANAGER_CONTEXT); - } - - async ensureContentType(id?: string) { - if (!id) return; - if (this.#contentTypes.getValue().find((x) => x.id === id)) return; - const contentType = await this.#loadContentType(id); - return contentType; - } - - async #loadContentType(id?: string) { - if (!id) return {}; - - const { data } = await this.#contentTypeRepository.requestById(id); - if (!data) return {}; - - // We could have used the global store of Document Types, but to ensure we first react ones the latest is loaded then we have our own local store: - // TODO: Revisit if this is right to do. Notice this can potentially be proxied to the global store. - this.#contentTypes.appendOne(data); - - return data; - } - - contentTypeOf(contentTypeUdi: string) { - const contentTypeId = getKeyFromUdi(contentTypeUdi); - return this.#contentTypes.asObservablePart((source) => source.find((x) => x.id === contentTypeId)); - } - contentTypeNameOf(contentTypeUdi: string) { - const contentTypeId = getKeyFromUdi(contentTypeUdi); - return this.#contentTypes.asObservablePart((source) => source.find((x) => x.id === contentTypeId)?.name); - } - blockTypeOf(contentTypeKey: string) { - return this.#blockTypes.asObservablePart((source) => - source.find((x) => x.contentElementTypeKey === contentTypeKey), - ); - } - layoutOf(contentUdi: string) { - return this.#layouts.asObservablePart((source) => source.find((x) => x.contentUdi === contentUdi)); - } - contentOf(udi: string) { - return this.#contents.asObservablePart((source) => source.find((x) => x.udi === udi)); - } - settingsOf(udi: string) { - return this.#settings.asObservablePart((source) => source.find((x) => x.udi === udi)); - } - - createBlock(layoutEntry: BlockLayoutType, contentElementTypeKey: string) { - // Find block type. - const blockType = this.#blockTypes.value.find((x) => x.contentElementTypeKey === contentElementTypeKey); - if (!blockType) { - throw new Error(`Cannot create block, missing block type for ${contentElementTypeKey}`); - } - - this.#layouts.appendOne(layoutEntry); - - // Create content entry: - if (layoutEntry.contentUdi) { - this.#contents.appendOne({ - contentTypeKey: contentElementTypeKey, - udi: layoutEntry.contentUdi, - }); - } else { - throw new Error('Cannot create block, missing contentUdi'); - } - - //Create settings entry: - if (blockType.settingsElementTypeKey) { - if (layoutEntry.settingsUdi) { - this.#contents.appendOne({ - contentTypeKey: blockType.settingsElementTypeKey, - udi: layoutEntry.settingsUdi, - }); - } else { - throw new Error('Cannot create block, missing settingsUdi'); - } - } - } - - deleteBlock(contentUdi: string) { - const layout = this.#layouts.value.find((x) => x.contentUdi === contentUdi); - if (!layout) return; - - if (layout.settingsUdi) { - this.#settings.removeOne(layout.settingsUdi); - } - - this.#layouts.removeOne(contentUdi); - this.#contents.removeOne(contentUdi); - } -} - -export const UMB_BLOCK_MANAGER_CONTEXT = new UmbContextToken( - 'UmbBlockManagerContext', -); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/index.ts deleted file mode 100644 index 8a987704b4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './block-manager.context.js'; -export * from './block.context.js'; -export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/block-rte-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/block-rte-workspace.modal-token.ts new file mode 100644 index 0000000000..5bf97f06a0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/block-rte-workspace.modal-token.ts @@ -0,0 +1,20 @@ +import type { UmbBlockWorkspaceData } from '../../index.js'; +import type { UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbBlockRTEWorkspaceData + extends UmbBlockWorkspaceData<{ + index: number; + }> {} + +export const UMB_BLOCK_RTE_WORKSPACE_MODAL = new UmbModalToken( + 'Umb.Modal.Workspace', + { + modal: { + type: 'sidebar', + size: 'medium', + }, + data: { entityType: 'block', preset: {}, originData: { index: -1 } }, + // Recast the type, so the entityType data prop is not required: + }, +) as UmbModalToken, UmbWorkspaceValue>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/index.ts index 557b771a07..9065e8bf6c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/index.ts @@ -1 +1,2 @@ export const UMB_BLOCK_RTE_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.BlockRteType'; +export * from './block-rte-workspace.modal-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/views/block-rte-type-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/views/block-rte-type-workspace-view.element.ts index 7f79b07c28..d745f0c10f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/views/block-rte-type-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/views/block-rte-type-workspace-view.element.ts @@ -1,7 +1,7 @@ import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-block-rte-type-workspace-view-settings') export class UmbBlockRteTypeWorkspaceViewSettingsElement extends UmbLitElement implements UmbWorkspaceViewElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/views/manifests.ts index cae9402dea..e574f7aa62 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-rte/workspace/views/manifests.ts @@ -4,7 +4,7 @@ import type { ManifestWorkspaceView } from '@umbraco-cms/backoffice/extension-re export const workspaceViews: Array = [ { type: 'workspaceView', - alias: 'Umb.WorkspaceView.BlockType.List.Settings', + alias: 'Umb.WorkspaceView.BlockType.RTE.Settings', name: 'Block List Type Workspace Settings View', js: () => import('./block-rte-type-workspace-view.element.js'), weight: 1000, diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts index 75a2c49b32..b7732995ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts @@ -4,7 +4,7 @@ import { } from '@umbraco-cms/backoffice/document-type'; import { UmbDeleteEvent } from '@umbraco-cms/backoffice/event'; import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UmbRepositoryItemsManager } from '@umbraco-cms/backoffice/repository'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -14,7 +14,7 @@ export class UmbBlockTypeCardElement extends UmbLitElement { #itemManager = new UmbRepositoryItemsManager( this, DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, - (x) => x.id, + (x) => x.unique, ); @property({ type: String, attribute: false }) @@ -53,7 +53,7 @@ export class UmbBlockTypeCardElement extends UmbLitElement { } #onRequestDelete() { - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, async (modalManager) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, async (modalManager) => { const modalContext = modalManager.open(UMB_CONFIRM_MODAL, { data: { color: 'danger', diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/index.ts index fcdafe77a5..2ce6e9bff7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/index.ts @@ -1,2 +1,2 @@ -export * from './input-block-type/index.js'; export * from './block-type-card/index.js'; +export * from './input-block-type/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts index 3936422192..1dcad5fdf3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts @@ -1,18 +1,16 @@ -import { UmbBlockTypeBase } from '../../types.js'; -import { - UMB_DOCUMENT_TYPE_PICKER_MODAL, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_WORKSPACE_MODAL, - UmbModalRouteRegistrationController, -} from '@umbraco-cms/backoffice/modal'; +import type { UmbBlockTypeBaseModel } from '../../types.js'; +import { UMB_DOCUMENT_TYPE_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import '../block-type-card/index.js'; import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-input-block-type') -export class UmbInputBlockTypeElement extends UmbLitElement { - // +export class UmbInputBlockTypeElement< + BlockType extends UmbBlockTypeBaseModel = UmbBlockTypeBaseModel, +> extends UmbLitElement { @property({ type: Array, attribute: false }) public get value() { return this._items; @@ -21,47 +19,27 @@ export class UmbInputBlockTypeElement { - return { data: { entityType: entityType, preset: {} }, modal: { size: 'large' } }; - }) - .observeRouteBuilder((routeBuilder) => { - const newpath = routeBuilder({}); - this._workspacePath = newpath; - }); - } - } - #entityType?: string; + @property({ type: String }) + workspacePath?: string; @state() private _items: Array = []; - @state() - private _workspacePath?: string; - - #blockTypeWorkspaceModalRegistration?: UmbModalRouteRegistrationController< - typeof UMB_WORKSPACE_MODAL.DATA, - typeof UMB_WORKSPACE_MODAL.VALUE - >; + #datasetContext?: UmbPropertyDatasetContext; + #filter: Array = []; constructor() { super(); + this.consumeContext(UMB_PROPERTY_DATASET_CONTEXT, async (instance) => { + this.#datasetContext = instance; + this.observe(await this.#datasetContext?.propertyValueByAlias('blocks'), (value) => { + this.#filter = value as Array; + }); + }); } create() { - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, async (modalManager) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, async (modalManager) => { if (modalManager) { // TODO: Make as mode for the Picker Modal, so the click to select immediately submits the modal(And in that mode we do not want to see a Submit button). const modalContext = modalManager.open(UMB_DOCUMENT_TYPE_PICKER_MODAL, { @@ -72,23 +50,23 @@ export class UmbInputBlockTypeElement x.contentElementTypeKey === docType.id) === undefined, + this.#filter && + this.#filter.find((x) => x.contentElementTypeKey === docType.unique) === undefined, }, }); const modalValue = await modalContext?.onSubmit(); const selectedElementType = modalValue.selection[0]; + if (selectedElementType) { - this.#blockTypeWorkspaceModalRegistration?.open({}, 'create/' + selectedElementType); + this.dispatchEvent(new CustomEvent('create', { detail: { contentElementTypeKey: selectedElementType } })); } } }); - - // No need to fire a change event, as all changes are made directly to the property, via context api. } deleteItem(contentElementTypeKey: string) { - this._items = this._items.filter((x) => x.contentElementTypeKey !== contentElementTypeKey); + this.value = this._items.filter((x) => x.contentElementTypeKey !== contentElementTypeKey); this.dispatchEvent(new UmbChangeEvent()); } @@ -97,12 +75,21 @@ export class UmbInputBlockTypeElement item.contentElementTypeKey, this.#renderItem) : ''} - ${this.#renderButton()} - `; + return html`
+ ${repeat(this.value, (block) => block.contentElementTypeKey, this.#renderItem)} ${this.#renderButton()} +
`; } + #renderItem = (item: BlockType) => { + return html` + this.deleteItem(item.contentElementTypeKey)}> + + `; + }; + #renderButton() { return html` this.create()} label="open"> @@ -112,19 +99,9 @@ export class UmbInputBlockTypeElement { - return html` - this.deleteItem(item.contentElementTypeKey)}> - - `; - }; - static styles = [ css` - :host { + div { display: grid; gap: var(--uui-size-space-3); grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); @@ -133,6 +110,7 @@ export class UmbInputBlockTypeElement = { title: 'Property Editor UIs/Block Grid Group Configuration', component: 'umb-property-editor-ui-block-type-group-configuration', id: 'umb-property-editor-ui-block-type-group-configuration', -} as Meta; +}; -export const AAAOverview: Story = () => - html``; -AAAOverview.storyName = 'Overview'; +export default meta; +type Story = StoryObj; + +export const Overview: Story = { + render: () => + html``, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/types.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/types.ts index c3b2591cbd..b949ca70f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/types.ts @@ -1,11 +1,11 @@ import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; -export interface UmbBlockTypeBase { +export interface UmbBlockTypeBaseModel { contentElementTypeKey: string; settingsElementTypeKey?: string; label?: string; - view?: string; - stylesheet?: string; + view?: string; // TODO: remove/replace with custom element manifest type for block list. + stylesheet?: string; // TODO: remove/replace with custom element manifest type for block list. iconColor?: string; backgroundColor?: string; editorSize?: UUIModalSidebarSize; @@ -17,6 +17,6 @@ export interface UmbBlockTypeGroup { key: string; } -export interface UmbBlockTypeWithGroupKey extends UmbBlockTypeBase { +export interface UmbBlockTypeWithGroupKey extends UmbBlockTypeBaseModel { groupKey?: string | null; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace-editor.element.ts index b22b606760..97b8c61af0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace-editor.element.ts @@ -3,7 +3,8 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { customElement, css, html, state, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbRepositoryItemsManager } from '@umbraco-cms/backoffice/repository'; -import { DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, UmbDocumentTypeItemModel } from '@umbraco-cms/backoffice/document-type'; +import type { UmbDocumentTypeItemModel } from '@umbraco-cms/backoffice/document-type'; +import { DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS } from '@umbraco-cms/backoffice/document-type'; @customElement('umb-block-type-workspace-editor') export class UmbBlockTypeWorkspaceEditorElement extends UmbLitElement { @@ -11,7 +12,7 @@ export class UmbBlockTypeWorkspaceEditorElement extends UmbLitElement { #itemManager = new UmbRepositoryItemsManager( this, DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, - (x) => x.id, + (x) => x.unique, ); #workspaceContext?: typeof UMB_BLOCK_TYPE_WORKSPACE_CONTEXT.TYPE; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts index d866fb7ebf..82ca7316ea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.context.ts @@ -1,18 +1,21 @@ -import type { UmbBlockTypeBase } from '../types.js'; -import { UMB_PROPERTY_CONTEXT, UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; -import { +import type { UmbBlockTypeBaseModel, UmbBlockTypeWithGroupKey } from '../types.js'; +import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; +import type { UmbInvariantableWorkspaceContextInterface, - UmbEditableWorkspaceContextBase, UmbWorkspaceContextInterface, +} from '@umbraco-cms/backoffice/workspace'; +import { + UmbEditableWorkspaceContextBase, UmbInvariantWorkspacePropertyDatasetContext, } from '@umbraco-cms/backoffice/workspace'; import { UmbArrayState, UmbObjectState, appendToFrozenArray } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { ManifestWorkspace, PropertyEditorConfigProperty } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestWorkspace, PropertyEditorConfigProperty } from '@umbraco-cms/backoffice/extension-registry'; -export class UmbBlockTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase +export class UmbBlockTypeWorkspaceContext + extends UmbEditableWorkspaceContextBase implements UmbInvariantableWorkspaceContextInterface { // Just for context token safety: @@ -31,7 +34,7 @@ export class UmbBlockTypeWorkspaceContext { this.observe(context.value, (value) => { if (value) { - const blockTypeData = value.find((x: UmbBlockTypeBase) => x.contentElementTypeKey === unique); + const blockTypeData = value.find((x: UmbBlockTypeBaseModel) => x.contentElementTypeKey === unique); if (blockTypeData) { - this.#data.next(blockTypeData); + this.#data.setValue(blockTypeData); return; } } // Fallback to undefined: - this.#data.next(undefined); + this.#data.setValue(undefined); }); }); } - async create(contentElementTypeId: string) { + async create(contentElementTypeId: string, groupKey?: string | null) { + //Only set groupKey property if it exists const data: BlockTypeData = { contentElementTypeKey: contentElementTypeId, + ...(groupKey && { groupKey: groupKey }), } as BlockTypeData; this.setIsNew(true); - this.#data.next(data); + this.#data.setValue(data); return { data }; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.element.ts index f4b68cd0db..af2c7dda6a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/block-type-workspace.element.ts @@ -6,8 +6,10 @@ import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; -import { UmbApi, UmbExtensionsApiInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; -import { ManifestWorkspace, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbExtensionsApiInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-block-type-workspace') export class UmbBlockTypeWorkspaceElement extends UmbLitElement { @@ -37,11 +39,13 @@ export class UmbBlockTypeWorkspaceElement extends UmbLitElement { this._routes = [ { - path: 'create/:elementTypeKey', + // Would it make more sense to have groupKey before elementTypeKey? + path: 'create/:elementTypeKey/:groupKey', component: this.#editorElement, setup: async (_component, info) => { const elementTypeKey = info.match.params.elementTypeKey; - this.#workspaceContext!.create(elementTypeKey); + const groupKey = info.match.params.groupKey === 'null' ? null : info.match.params.groupKey; + this.#workspaceContext!.create(elementTypeKey, groupKey); new UmbWorkspaceIsNewRedirectController( this, diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/conditions/block-workspace-has-settings.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/conditions/block-workspace-has-settings.condition.ts new file mode 100644 index 0000000000..434cc1b455 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/conditions/block-workspace-has-settings.condition.ts @@ -0,0 +1,41 @@ +import { UMB_BLOCK_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/block'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import type { + ManifestCondition, + UmbConditionConfigBase, + UmbConditionControllerArguments, + UmbExtensionCondition, +} from '@umbraco-cms/backoffice/extension-api'; + +export class UmbBlockWorkspaceHasSettingsCondition extends UmbBaseController implements UmbExtensionCondition { + config: BlockWorkspaceHasSettingsConditionConfig; + permitted = false; + #onChange: () => void; + + constructor(args: UmbConditionControllerArguments) { + super(args.host); + this.config = args.config; + this.#onChange = args.onChange; + + this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (context) => { + this.observe( + context.settings.contentTypeId, + (settingsContentTypeId) => { + this.permitted = !!settingsContentTypeId; + this.#onChange(); + }, + 'observeSettingsElementTypeId', + ); + }); + } +} + +export type BlockWorkspaceHasSettingsConditionConfig = + UmbConditionConfigBase<'Umb.Condition.BlockWorkspaceHasSettings'>; + +export const manifest: ManifestCondition = { + type: 'condition', + name: 'Block Has Settings Condition', + alias: 'Umb.Condition.BlockWorkspaceHasSettings', + api: UmbBlockWorkspaceHasSettingsCondition, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/conditions/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/conditions/index.ts new file mode 100644 index 0000000000..0c6d9fc984 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/conditions/index.ts @@ -0,0 +1 @@ +export * from './block-workspace-has-settings.condition.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/block.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entity.context.ts similarity index 54% rename from src/Umbraco.Web.UI.Client/src/packages/block/block-manager/block.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entity.context.ts index a6fa67ec67..9f9d417e10 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/block.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-entity.context.ts @@ -1,17 +1,22 @@ -import type { UmbBlockTypeBase } from '../block-type/types.js'; -import type { UmbBlockLayoutBaseModel, UmbBlockDataType } from './types.js'; -import { UMB_BLOCK_MANAGER_CONTEXT, type UmbBlockManagerContext } from './block-manager.context.js'; +import type { UmbBlockTypeBaseModel } from '../../block-type/types.js'; +import type { UmbBlockLayoutBaseModel, UmbBlockDataType } from '../types.js'; +import type { UMB_BLOCK_MANAGER_CONTEXT, UmbBlockManagerContext } from '../manager/index.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; +import { encodeFilePath } from '@umbraco-cms/backoffice/utils'; -export class UmbBlockContext< - BlockType extends UmbBlockTypeBase = UmbBlockTypeBase, +export abstract class UmbBlockContext< + BlockManagerContextTokenType extends UmbContextToken, + BlockManagerContextType extends UmbBlockManagerContext, + BlockType extends UmbBlockTypeBaseModel = UmbBlockTypeBaseModel, BlockLayoutType extends UmbBlockLayoutBaseModel = UmbBlockLayoutBaseModel, -> extends UmbContextBase { +> extends UmbContextBase< + UmbBlockContext +> { // - #manager?: UmbBlockManagerContext; + _manager?: BlockManagerContextType; #blockTypeName = new UmbStringState(undefined); public readonly blockTypeName = this.#blockTypeName.asObservable(); @@ -19,10 +24,19 @@ export class UmbBlockContext< #label = new UmbStringState(''); public readonly label = this.#label.asObservable(); - #blockType = new UmbObjectState(undefined); - public readonly blockType = this.#blockType.asObservable(); - public readonly blockTypeContentElementTypeKey = this.#blockType.asObservablePart((x) => x?.contentElementTypeKey); - public readonly blockTypeSettingsElementTypeKey = this.#blockType.asObservablePart((x) => x?.settingsElementTypeKey); + #workspacePath = new UmbStringState(undefined); + public readonly workspacePath = this.#workspacePath.asObservable(); + public readonly workspaceEditPath = this.#workspacePath.asObservablePart( + (path) => path + 'edit/' + encodeFilePath(this.getContentUdi() ?? ''), + ); + public readonly workspaceEditSettingsPath = this.#workspacePath.asObservablePart( + (path) => path + 'edit/' + encodeFilePath(this.getContentUdi() ?? '') + '/view/settings', + ); + + _blockType = new UmbObjectState(undefined); + public readonly blockType = this._blockType.asObservable(); + public readonly blockTypeContentElementTypeKey = this._blockType.asObservablePart((x) => x?.contentElementTypeKey); + public readonly blockTypeSettingsElementTypeKey = this._blockType.asObservablePart((x) => x?.settingsElementTypeKey); #layout = new UmbObjectState(undefined); public readonly layout = this.#layout.asObservable(); @@ -42,17 +56,16 @@ export class UmbBlockContext< * @returns {void} */ setLayout(layout: BlockLayoutType | undefined) { - this.#layout.next(layout); + this.#layout.setValue(layout); } - constructor(host: UmbControllerHost) { - super(host, UMB_BLOCK_CONTEXT); + constructor(host: UmbControllerHost, blockManagerContextToken: BlockManagerContextTokenType) { + super(host, UMB_BLOCK_ENTITY_CONTEXT.toString()); // Consume block manager: - this.consumeContext(UMB_BLOCK_MANAGER_CONTEXT, (manager) => { - this.#manager = manager; - this.#observeBlockType(); - this.#observeData(); + this.consumeContext(blockManagerContextToken, (manager) => { + this._manager = manager; + this._gotManager(); }); // Observe UDI: @@ -70,21 +83,41 @@ export class UmbBlockContext< // Observe blockType: this.observe(this.blockType, (blockType) => { if (!blockType) return; - this.#observeBlockTypeLabel(); this.#observeBlockTypeContentElementName(); + this.#observeBlockTypeLabel(); }); } + getContentUdi() { + return this.#layout.value?.contentUdi; + } + + _gotManager() { + if (this._manager) { + this.observe( + this._manager.workspacePath, + (workspacePath) => { + this.#workspacePath.setValue(workspacePath); + }, + 'observeWorkspacePath', + ); + } else { + this.removeControllerByAlias('observeWorkspacePath'); + } + this.#observeBlockType(); + this.#observeData(); + } + #observeData() { - if (!this.#manager) return; + if (!this._manager) return; const contentUdi = this.#layout.value?.contentUdi; if (!contentUdi) return; // observe content: this.observe( - this.#manager.contentOf(contentUdi), + this._manager.contentOf(contentUdi), (content) => { - this.#content.next(content); + this.#content.setValue(content); }, 'observeContent', ); @@ -93,9 +126,9 @@ export class UmbBlockContext< const settingsUdi = this.#layout.value?.settingsUdi; if (settingsUdi) { this.observe( - this.#manager.contentOf(settingsUdi), + this._manager.contentOf(settingsUdi), (content) => { - this.#settings.next(content); + this.#settings.setValue(content); }, 'observeSettings', ); @@ -103,29 +136,44 @@ export class UmbBlockContext< } #observeBlockType() { - if (!this.#manager) return; + if (!this._manager) return; const contentTypeKey = this.#content.value?.contentTypeKey; if (!contentTypeKey) return; // observe blockType: this.observe( - this.#manager.blockTypeOf(contentTypeKey), + this._manager.blockTypeOf(contentTypeKey), (blockType) => { - this.#blockType.next(blockType as BlockType); + this._blockType.setValue(blockType as BlockType); }, 'observeBlockType', ); } + #observeBlockTypeContentElementName() { + if (!this._manager) return; + const contentElementTypeKey = this._blockType.value?.contentElementTypeKey; + if (!contentElementTypeKey) return; + + // observe blockType: + this.observe( + this._manager.contentTypeNameOf(contentElementTypeKey), + (contentTypeName) => { + this.#blockTypeName.setValue(contentTypeName); + }, + 'observeBlockTypeContentElementTypeName', + ); + } + #observeBlockTypeLabel() { - if (!this.#manager) return; - const blockType = this.#blockType.value; + if (!this._manager) return; + const blockType = this._blockType.value; if (!blockType) return; if (blockType.label) { this.removeControllerByAlias('observeContentTypeName'); // Missing part for label syntax, as we need to store the syntax, interpretive it and then set the label: (here we are just parsing the label syntax) - this.#label.next(blockType.label); + this.#label.setValue(blockType.label); return; } else { // TODO: Maybe this could be skipped if we had a fallback label which was set to get the content element type name? @@ -133,36 +181,23 @@ export class UmbBlockContext< this.observe( this.blockTypeName, (contentTypeName) => { - this.#label.next(contentTypeName ?? 'no name'); + this.#label.setValue(contentTypeName ?? 'no name'); }, 'observeBlockTypeName', ); } } - #observeBlockTypeContentElementName() { - if (!this.#manager) return; - const contentElementTypeKey = this.#blockType.value?.contentElementTypeKey; - if (!contentElementTypeKey) return; - - // observe blockType: - this.observe( - this.#manager.contentTypeNameOf(contentElementTypeKey), - (contentTypeName) => { - this.#blockTypeName.next(contentTypeName); - }, - 'observeBlockTypeContentElementTypeName', - ); - } - // Public methods: public delete() { - if (!this.#manager) return; + if (!this._manager) return; const contentUdi = this.#layout.value?.contentUdi; if (!contentUdi) return; - this.#manager.deleteBlock(contentUdi); + this._manager.deleteBlock(contentUdi); } } -export const UMB_BLOCK_CONTEXT = new UmbContextToken('UmbBlockContext'); +export const UMB_BLOCK_ENTITY_CONTEXT = new UmbContextToken< + UmbBlockContext +>('UmbBlockContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/index.ts new file mode 100644 index 0000000000..689c247d82 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/index.ts @@ -0,0 +1 @@ +export * from './block-entity.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/index.ts index 9e897c4aa4..abccb4df2a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/index.ts @@ -1 +1,6 @@ +export * from './conditions/index.js'; +export * from './context/index.js'; +export * from './manager/index.js'; export * from './modals/index.js'; +export * from './types.js'; +export * from './workspace/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context-token.ts new file mode 100644 index 0000000000..eb7dacc74b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context-token.ts @@ -0,0 +1,4 @@ +import type { UmbBlockManagerContext } from './block-manager.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_BLOCK_MANAGER_CONTEXT = new UmbContextToken('UmbBlockManagerContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context.ts new file mode 100644 index 0000000000..0ab646f59a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/block-manager.context.ts @@ -0,0 +1,205 @@ +import type { UmbBlockLayoutBaseModel, UmbBlockDataType } from '../types.js'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbArrayState, UmbClassState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type'; +import { buildUdi, getKeyFromUdi } from '@umbraco-cms/backoffice/utils'; +import type { UmbBlockTypeBaseModel, UmbBlockWorkspaceData } from '@umbraco-cms/backoffice/block'; +import { UMB_BLOCK_MANAGER_CONTEXT, UMB_BLOCK_WORKSPACE_MODAL } from '@umbraco-cms/backoffice/block'; +import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; +import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; + +// TODO: We are using backend model here, I think we should get our own model: +type ElementTypeModel = UmbContentTypeModel; + +export abstract class UmbBlockManagerContext< + BlockType extends UmbBlockTypeBaseModel = UmbBlockTypeBaseModel, + BlockLayoutType extends UmbBlockLayoutBaseModel = UmbBlockLayoutBaseModel, +> extends UmbContextBase { + // + #contentTypeRepository = new UmbDocumentTypeDetailRepository(this); + + #workspacePath = new UmbStringState(undefined); + workspacePath = this.#workspacePath.asObservable(); + + #contentTypes = new UmbArrayState(>[], (x) => x.unique); + public readonly contentTypes = this.#contentTypes.asObservable(); + + #blockTypes = new UmbArrayState(>[], (x) => x.contentElementTypeKey); + public readonly blockTypes = this.#blockTypes.asObservable(); + + #editorConfiguration = new UmbClassState(undefined); + public readonly editorConfiguration = this.#editorConfiguration.asObservable(); + + protected _layouts = new UmbArrayState(>[], (x) => x.contentUdi); + public readonly layouts = this._layouts.asObservable(); + + #contents = new UmbArrayState(>[], (x) => x.udi); + public readonly contents = this.#contents.asObservable(); + + #settings = new UmbArrayState(>[], (x) => x.udi); + public readonly settings = this.#settings.asObservable(); + + setEditorConfiguration(configs: UmbPropertyEditorConfigCollection) { + this.#editorConfiguration.setValue(configs); + } + + setBlockTypes(blockTypes: Array) { + this.#blockTypes.setValue(blockTypes); + } + getBlockTypes() { + return this.#blockTypes.value; + } + + setLayouts(layouts: Array) { + this._layouts.setValue(layouts); + } + + setContents(contents: Array) { + this.#contents.setValue(contents); + } + setSettings(settings: Array) { + this.#settings.setValue(settings); + } + + constructor(host: UmbControllerHost) { + super(host, UMB_BLOCK_MANAGER_CONTEXT); + + // TODO: This might will need the property alias as part of the URL, to avoid collision if multiple of these Editor on same Node. + // IDEA: Make a Workspace registration controller that can be used to register a workspace, which does both edit and create?. + new UmbModalRouteRegistrationController(this, UMB_BLOCK_WORKSPACE_MODAL) + .addAdditionalPath('block') + .onSetup(() => { + return { data: { entityType: 'block', preset: {} }, modal: { size: 'medium' } }; + }) + .observeRouteBuilder((routeBuilder) => { + const newPath = routeBuilder({}); + this.#workspacePath.setValue(newPath); + }); + } + + async ensureContentType(unique?: string) { + if (!unique) return; + if (this.#contentTypes.getValue().find((x) => x.unique === unique)) return; + const contentType = await this.#loadContentType(unique); + return contentType; + } + + async #loadContentType(unique?: string) { + if (!unique) return {}; + + const { data } = await this.#contentTypeRepository.requestByUnique(unique); + if (!data) return {}; + + // We could have used the global store of Document Types, but to ensure we first react ones the latest is loaded then we have our own local store: + // TODO: Revisit if this is right to do. Notice this can potentially be proxied to the global store. + this.#contentTypes.appendOne(data); + + return data; + } + + contentTypeOf(contentTypeUdi: string) { + const contentTypeUnique = getKeyFromUdi(contentTypeUdi); + return this.#contentTypes.asObservablePart((source) => source.find((x) => x.unique === contentTypeUnique)); + } + contentTypeNameOf(contentTypeKey: string) { + return this.#contentTypes.asObservablePart((source) => source.find((x) => x.unique === contentTypeKey)?.name); + } + blockTypeOf(contentTypeKey: string) { + return this.#blockTypes.asObservablePart((source) => + source.find((x) => x.contentElementTypeKey === contentTypeKey), + ); + } + + layoutOf(contentUdi: string) { + return this._layouts.asObservablePart((source) => source.find((x) => x.contentUdi === contentUdi)); + } + contentOf(udi: string) { + return this.#contents.asObservablePart((source) => source.find((x) => x.udi === udi)); + } + settingsOf(udi: string) { + return this.#settings.asObservablePart((source) => source.find((x) => x.udi === udi)); + } + + setOneLayout(layoutData: BlockLayoutType) { + return this._layouts.appendOne(layoutData); + } + setOneContent(contentData: UmbBlockDataType) { + this.#contents.appendOne(contentData); + } + setOneSettings(settingsData: UmbBlockDataType) { + this.#settings.appendOne(settingsData); + } + + abstract _createBlock( + modalData: UmbBlockWorkspaceData, + layoutEntry: Omit, + contentElementTypeKey: string, + ): boolean; + + public createBlock( + modalData: UmbBlockWorkspaceData, + layoutEntry: Omit, + contentElementTypeKey: string, + ) { + // Find block type. + const blockType = this.#blockTypes.value.find((x) => x.contentElementTypeKey === contentElementTypeKey); + if (!blockType) { + throw new Error(`Cannot create block, missing block type for ${contentElementTypeKey}`); + return false; + } + + // Create layout entry: + const fullLayoutEntry: BlockLayoutType = { + contentUdi: buildUdi('element', UmbId.new()), + ...(layoutEntry as Partial), + } as BlockLayoutType; + if (blockType.settingsElementTypeKey) { + fullLayoutEntry.settingsUdi = buildUdi('element', UmbId.new()); + } + + if (this._createBlock(modalData, fullLayoutEntry, contentElementTypeKey) === false) { + return false; + } + + // Create content entry: + if (fullLayoutEntry.contentUdi) { + this.#contents.appendOne({ + contentTypeKey: contentElementTypeKey, + udi: fullLayoutEntry.contentUdi, + }); + } else { + throw new Error('Cannot create block, missing contentUdi'); + return false; + } + + //Create settings entry: + if (blockType.settingsElementTypeKey) { + if (fullLayoutEntry.settingsUdi) { + this.#contents.appendOne({ + contentTypeKey: blockType.settingsElementTypeKey, + udi: fullLayoutEntry.settingsUdi, + }); + } else { + throw new Error('Cannot create block, missing settingsUdi'); + return false; + } + } + + return true; + } + + deleteBlock(contentUdi: string) { + const layout = this._layouts.value.find((x) => x.contentUdi === contentUdi); + if (!layout) return; + + if (layout.settingsUdi) { + this.#settings.removeOne(layout.settingsUdi); + } + + this._layouts.removeOne(contentUdi); + this.#contents.removeOne(contentUdi); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/index.ts new file mode 100644 index 0000000000..9116a8ebf8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/manager/index.ts @@ -0,0 +1,2 @@ +export * from './block-manager.context-token.js'; +export type * from './block-manager.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/manifests.ts index 684effeb51..1582d740af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/manifests.ts @@ -1,3 +1,5 @@ +import { manifest as blockWorkspaceHasSettingsConditionManifest } from './conditions/block-workspace-has-settings.condition.js'; import { manifests as modalManifests } from './modals/manifests.js'; +import { manifests as workspaceManifests } from './workspace/manifests.js'; -export const manifests = [...modalManifests]; +export const manifests = [...modalManifests, ...workspaceManifests, blockWorkspaceHasSettingsConditionManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts index 8b1210ccd3..1beec67023 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.element.ts @@ -1,12 +1,16 @@ -import { +import { UMB_BLOCK_WORKSPACE_MODAL } from '../../workspace/index.js'; +import type { UmbBlockCatalogueModalData, UmbBlockCatalogueModalValue, + UmbBlockTypeGroup, UmbBlockTypeWithGroupKey, } from '@umbraco-cms/backoffice/block'; -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document'; import { css, html, customElement, state, repeat, ifDefined, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { groupBy } from '@umbraco-cms/backoffice/external/lodash'; -import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { + UMB_MODAL_CONTEXT, + UmbModalBaseElement, + UmbModalRouteRegistrationController, +} from '@umbraco-cms/backoffice/modal'; @customElement('umb-block-catalogue-modal') export class UmbBlockCatalogueModalElement extends UmbModalBaseElement< @@ -14,32 +18,57 @@ export class UmbBlockCatalogueModalElement extends UmbModalBaseElement< UmbBlockCatalogueModalValue > { @state() - private _blocks: Array = []; + private _groupedBlocks: Array<{ name?: string; blocks: Array }> = []; @state() - private _blockGroups: Array<{ key: string; name: string }> = []; + _openClipboard?: boolean; @state() - openClipboard?: boolean; + _workspacePath?: string; + + constructor() { + super(); + + this.consumeContext(UMB_MODAL_CONTEXT, (modalContext) => { + new UmbModalRouteRegistrationController(this, UMB_BLOCK_WORKSPACE_MODAL) + //.addAdditionalPath('block') // No need for additional path specification in this context as this is for sure the only workspace we want to open here. + .onSetup(() => { + return { + data: { preset: {}, originData: (modalContext.data as UmbBlockCatalogueModalData).blockOriginData }, + }; + }) + .onSubmit(() => { + // When workspace is submitted, we want to close this modal. + this.modalContext?.submit(); + }) + .observeRouteBuilder((routeBuilder) => { + this._workspacePath = routeBuilder({}); + }); + }); + } connectedCallback() { super.connectedCallback(); if (!this.data) return; - this.openClipboard = this.data.openClipboard ?? false; - this._blocks = this.data.blocks ?? []; - this._blockGroups = this.data.blockGroups ?? []; - } + this._openClipboard = this.data.openClipboard ?? false; - #onClickBlock(contentElementTypeKey: string) { - this.modalContext?.updateValue({ key: contentElementTypeKey }); - this.modalContext?.submit(); + const blocks: Array = this.data.blocks ?? []; + const blockGroups: Array = this.data.blockGroups ?? []; + + const noGroupBlocks = blocks.filter((block) => !blockGroups.find((group) => group.key === block.groupKey)); + const grouped = blockGroups.map((group) => ({ + name: group.name ?? '', + blocks: blocks.filter((block) => block.groupKey === group.key), + })); + + this._groupedBlocks = [{ blocks: noGroupBlocks }, ...grouped]; } render() { return html` - ${this.#renderViews()} ${this.openClipboard ? this.#renderClipboard() : this.#renderCreateEmpty()} + ${this.#renderViews()} ${this._openClipboard ? this.#renderClipboard() : this.#renderCreateEmpty()}
{ - const group = this._blockGroups.find((group) => group.key === key); - return { name: group?.name, blocks: value }; - }); - return html` - ${mappedGroupsAndBlocks.map( + ${this._groupedBlocks.map( (group) => html` - ${group.name ? html`

${group.name}

` : nothing} + ${group.name ? html`

${group.name}

` : nothing}
${repeat( group.blocks, @@ -77,7 +99,7 @@ export class UmbBlockCatalogueModalElement extends UmbModalBaseElement< name=${ifDefined(block.label)} background=${ifDefined(block.backgroundColor)} style="color: ${block.iconColor}" - @open=${() => this.#onClickBlock(block.contentElementTypeKey)}> + href="${this._workspacePath}create/${block.contentElementTypeKey}"> `, @@ -91,12 +113,18 @@ export class UmbBlockCatalogueModalElement extends UmbModalBaseElement< #renderViews() { return html` - (this.openClipboard = false)}> - Create Empty + (this._openClipboard = false)}> + Create Empty - (this.openClipboard = true)}> - Clipboard + (this._openClipboard = true)}> + Clipboard diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.token.ts index 1dda60f105..7a68521e47 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/modals/block-catalogue/block-catalogue-modal.token.ts @@ -1,17 +1,16 @@ -import { UmbBlockTypeBase } from '@umbraco-cms/backoffice/block'; +import type { UmbBlockTypeBaseModel, UmbBlockTypeGroup, UmbBlockWorkspaceData } from '@umbraco-cms/backoffice/block'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbBlockCatalogueModalData { - blocks: Array; - blockGroups?: Array<{ name: string; key: string }>; + blocks: Array; + blockGroups?: Array; openClipboard?: boolean; + blockOriginData: UmbBlockWorkspaceData['originData']; } -export interface UmbBlockCatalogueModalValue { - key: string; -} +export type UmbBlockCatalogueModalValue = never; -export const UMB_BLOCK_CATALOGUE_MODAL = new UmbModalToken( +export const UMB_BLOCK_CATALOGUE_MODAL = new UmbModalToken( 'Umb.Modal.BlockCatalogue', { modal: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/types.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/types.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/packages/block/block-manager/types.ts rename to src/Umbraco.Web.UI.Client/src/packages/block/block/types.ts index 1883faa267..8956368b42 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-manager/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/types.ts @@ -6,6 +6,7 @@ export interface UmbBlockLayoutBaseModel { export interface UmbBlockDataType { udi: string; contentTypeKey: string; + [key: string]: unknown; } export interface UmbBlockValueType { diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-manager.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-manager.ts new file mode 100644 index 0000000000..1d5ea7a281 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-manager.ts @@ -0,0 +1,84 @@ +import type { UmbBlockDataType } from '../types.js'; +import { UmbBlockElementPropertyDatasetContext } from './block-element-property-dataset.context.js'; +import type { UmbContentTypeModel} from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; +import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type'; + +export class UmbBlockElementManager extends UmbBaseController { + // + #data = new UmbObjectState(undefined); + readonly data = this.#data.asObservable(); + #getDataPromise = new Promise((resolve) => { + this.#getDataResolver = resolve; + }); + #getDataResolver!: () => void; + + readonly unique = this.#data.asObservablePart((data) => data?.udi); + readonly contentTypeId = this.#data.asObservablePart((data) => data?.contentTypeKey); + + readonly structure = new UmbContentTypePropertyStructureManager( + this, + new UmbDocumentTypeDetailRepository(this), + ); + + constructor(host: UmbControllerHost) { + // TODO: Get Workspace Alias via Manifest. + super(host); + + this.observe(this.contentTypeId, (id) => this.structure.loadType(id)); + } + + setData(data: UmbBlockDataType | undefined) { + this.#data.setValue(data); + this.#getDataResolver(); + } + + getData() { + return this.#data.getValue(); + } + + getEntityId() { + return this.getData()?.udi; + } + + getEntityType() { + return 'element'; + } + + getContentTypeId() { + return this.getData()?.contentTypeKey; + } + + async propertyValueByAlias(propertyAlias: string) { + await this.#getDataPromise; + + return this.#data.asObservablePart((data) => data?.[propertyAlias] as ReturnType); + } + + async getPropertyValue(propertyAlias: string) { + await this.#getDataPromise; + + return this.#data.getValue()?.[propertyAlias] as ReturnType; + } + + async setPropertyValue(alias: string, value: unknown) { + await this.#getDataPromise; + + this.#data.update({ [alias]: value }); + } + + public createPropertyDatasetContext(host: UmbControllerHost) { + return new UmbBlockElementPropertyDatasetContext(host, this); + } + + public destroy(): void { + this.#data.destroy(); + this.structure.destroy(); + super.destroy(); + } +} + +export default UmbBlockElementManager; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-property-dataset.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-property-dataset.context-token.ts new file mode 100644 index 0000000000..db5f957cb2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-property-dataset.context-token.ts @@ -0,0 +1,6 @@ +import type { UmbBlockElementPropertyDatasetContext } from './block-element-property-dataset.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_BLOCK_ELEMENT_PROPERTY_DATASET_CONTEXT = new UmbContextToken( + 'UmbPropertyDatasetContext', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-property-dataset.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-property-dataset.context.ts new file mode 100644 index 0000000000..84d05898c6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-element-property-dataset.context.ts @@ -0,0 +1,51 @@ +import type { UmbBlockElementManager } from './block-element-manager.js'; +import { UMB_BLOCK_ELEMENT_PROPERTY_DATASET_CONTEXT } from './block-element-property-dataset.context-token.js'; +import type { UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property'; +import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; + +export class UmbBlockElementPropertyDatasetContext extends UmbBaseController implements UmbPropertyDatasetContext { + #elementManager: UmbBlockElementManager; + + // default data: + + getVariantId() { + return UmbVariantId.CreateInvariant(); + } + getEntityType() { + return this.#elementManager.getEntityType(); + } + getUnique() { + return this.#elementManager.getEntityId(); + } + + getName(): string | undefined { + return 'TODO: get label'; + } + readonly name: Observable = 'TODO: get label observable' as any; + + constructor(host: UmbControllerHost, elementManager: UmbBlockElementManager) { + // The controller alias, is a very generic name cause we want only one of these for this controller host. + super(host, UMB_PROPERTY_DATASET_CONTEXT.toString()); + this.#elementManager = elementManager; + + this.provideContext(UMB_BLOCK_ELEMENT_PROPERTY_DATASET_CONTEXT, this); + } + + /** + * TODO: Write proper JSDocs here. + */ + async propertyValueByAlias(propertyAlias: string) { + return await this.#elementManager.propertyValueByAlias(propertyAlias); + } + + /** + * TODO: Write proper JSDocs here. + */ + async setPropertyValue(propertyAlias: string, value: unknown) { + return this.#elementManager.setPropertyValue(propertyAlias, value); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace-editor.element.ts new file mode 100644 index 0000000000..ee4e734440 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace-editor.element.ts @@ -0,0 +1,47 @@ +import { UMB_BLOCK_WORKSPACE_CONTEXT } from './block-workspace.context-token.js'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { customElement, css, html, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +@customElement('umb-block-workspace-editor') +export class UmbBlockWorkspaceEditorElement extends UmbLitElement { + // + #workspaceContext?: typeof UMB_BLOCK_WORKSPACE_CONTEXT.TYPE; + + @property({ type: String, attribute: false }) + workspaceAlias?: string; + + constructor() { + super(); + + this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; + this.#workspaceContext?.content.createPropertyDatasetContext(this); + }); + } + + render() { + return this.workspaceAlias + ? html` ` + : ''; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + } + `, + ]; +} + +export default UmbBlockWorkspaceEditorElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-block-workspace-editor': UmbBlockWorkspaceEditorElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context-token.ts new file mode 100644 index 0000000000..696d6c70a4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context-token.ts @@ -0,0 +1,9 @@ +import type { UmbBlockWorkspaceContext } from './block-workspace.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; + +export const UMB_BLOCK_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbBlockWorkspaceContext => (context as any).IS_BLOCK_WORKSPACE_CONTEXT, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts new file mode 100644 index 0000000000..327498248a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.context.ts @@ -0,0 +1,272 @@ +import type { UmbBlockLayoutBaseModel, UmbBlockDataType } from '../types.js'; +import { UmbBlockElementManager } from './block-element-manager.js'; +import { UmbEditableWorkspaceContextBase } from '@umbraco-cms/backoffice/workspace'; +import { UmbBooleanState, UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { UmbBlockWorkspaceData } from '@umbraco-cms/backoffice/block'; +import { UMB_BLOCK_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/block'; +import { buildUdi } from '@umbraco-cms/backoffice/utils'; +import { UMB_MODAL_CONTEXT } from '@umbraco-cms/backoffice/modal'; + +export type UmbBlockWorkspaceElementManagerNames = 'content' | 'settings'; +export class UmbBlockWorkspaceContext< + LayoutDataType extends UmbBlockLayoutBaseModel = UmbBlockLayoutBaseModel, +> extends UmbEditableWorkspaceContextBase { + // Just for context token safety: + public readonly IS_BLOCK_WORKSPACE_CONTEXT = true; + // + readonly workspaceAlias; + + #blockManager?: typeof UMB_BLOCK_MANAGER_CONTEXT.TYPE; + #retrieveBlockManager; + #modalContext?: typeof UMB_MODAL_CONTEXT.TYPE; + #retrieveModalContext; + #editorConfigPromise?: Promise; + + #entityType: string; + + #isNew = new UmbBooleanState(undefined); + readonly isNew = this.#isNew.asObservable(); + + #liveEditingMode?: boolean; + + #layout = new UmbObjectState(undefined); + readonly layout = this.#layout.asObservable(); + //readonly unique = this.#layout.asObservablePart((x) => x?.contentUdi); + readonly contentUdi = this.#layout.asObservablePart((x) => x?.contentUdi); + + readonly content = new UmbBlockElementManager(this); + + readonly settings = new UmbBlockElementManager(this); + + // TODO: Get the name of the contentElementType.. + #label = new UmbStringState(undefined); + readonly name = this.#label.asObservable(); + + constructor(host: UmbControllerHost, workspaceArgs: { manifest: ManifestWorkspace }) { + super(host, workspaceArgs.manifest.alias); + this.#entityType = workspaceArgs.manifest.meta?.entityType; + this.workspaceAlias = workspaceArgs.manifest.alias; + + this.#retrieveModalContext = this.consumeContext(UMB_MODAL_CONTEXT, (context) => { + this.#modalContext = context; + context.onSubmit().catch(this.#modalRejected); + }).asPromise(); + + this.#retrieveBlockManager = this.consumeContext(UMB_BLOCK_MANAGER_CONTEXT, (context) => { + this.#blockManager = context; + this.#editorConfigPromise = this.observe(context.editorConfiguration, (editorConfigs) => { + if (editorConfigs) { + const value = editorConfigs.getValueByAlias('useLiveEditing'); + this.#liveEditingMode = value; + } + }).asPromise(); + // TODO: Observe or just get the LiveEditing setting? + }).asPromise(); + } + + async load(unique: string) { + await this.#retrieveBlockManager; + await this.#editorConfigPromise; + if (!this.#blockManager) { + throw new Error('Block manager not found'); + return; + } + + this.observe( + this.#blockManager.layoutOf(unique), + (layoutData) => { + this.#layout.setValue(layoutData as LayoutDataType); + + // Content: + const contentUdi = layoutData?.contentUdi; + if (contentUdi) { + this.observe( + this.#blockManager!.contentOf(contentUdi), + (contentData) => { + this.content.setData(contentData); + }, + 'observeContent', + ); + } + + // Settings: + const settingsUdi = layoutData?.settingsUdi; + if (settingsUdi) { + this.observe( + this.#blockManager!.settingsOf(settingsUdi), + (settingsData) => { + this.settings.setData(settingsData); + }, + 'observeSettings', + ); + } + }, + 'observeLayout', + ); + + if (this.#liveEditingMode) { + this.#establishLiveSync(); + } + } + + async create(contentElementTypeId: string) { + await this.#retrieveBlockManager; + await this.#retrieveModalContext; + if (!this.#blockManager) { + throw new Error('Block Manager not found'); + return; + } + if (!this.#modalContext) { + throw new Error('Modal Context not found'); + return; + } + // + // TODO: Condense this into some kind of create method? + const key = UmbId.new(); + const contentUdi = buildUdi('block', key); + const layoutData: UmbBlockLayoutBaseModel = { + contentUdi: contentUdi, + }; + const contentData: UmbBlockDataType = { + udi: contentUdi, + contentTypeKey: contentElementTypeId, + }; + this.content.setData(contentData); + + // TODO: If we have Settings dedicated to this block type, we initiate them here: + + this.setIsNew(true); + this.#layout.setValue(layoutData as LayoutDataType); + + if (this.#liveEditingMode) { + const blockCreated = this.#blockManager.createBlock( + this.#modalContext.data as UmbBlockWorkspaceData, + layoutData, + contentElementTypeId, + ); + if (!blockCreated) { + throw new Error('Block Manager could not create block'); + return; + } + + this.#establishLiveSync(); + } + } + + #establishLiveSync() { + this.observe(this.layout, (layoutData) => { + if (layoutData) { + this.#blockManager?.setOneLayout(layoutData); + } + }); + this.observe(this.content.data, (contentData) => { + if (contentData) { + this.#blockManager?.setOneContent(contentData); + } + }); + this.observe(this.settings.data, (settingsData) => { + if (settingsData) { + this.#blockManager?.setOneSettings(settingsData); + } + }); + } + + getIsNew() { + return this.#isNew.value; + } + setIsNew(value: boolean): void { + this.#isNew.setValue(value); + } + + getData() { + return this.#layout.getValue(); + } + + getEntityId() { + return this.getData()!.contentUdi; + } + + getEntityType() { + return this.#entityType; + } + + getName() { + return 'block name content element type here...'; + } + + // NOTICE currently the property methods are for layout, but this could be seen as wrong, we might need to dedicate a data manager for the layout as well. + + async propertyValueByAlias(propertyAlias: propertyAliasType) { + return this.#layout.asObservablePart( + (layout) => layout?.[propertyAlias as keyof LayoutDataType] as LayoutDataType[propertyAliasType], + ); + } + + getPropertyValue(propertyAlias: propertyAliasType) { + // TODO: Should be using Content, then we need a toggle or another method for getting settings. + return this.#layout.getValue()?.[propertyAlias as keyof LayoutDataType] as LayoutDataType[propertyAliasType]; + } + + async setPropertyValue(alias: string, value: unknown) { + const currentData = this.#layout.value; + if (currentData) { + this.#layout.update({ ...currentData, [alias]: value }); + } + } + + async save() { + const layoutData = this.#layout.value; + const contentData = this.content.getData(); + if (!layoutData || !this.#blockManager || !contentData || !this.#modalContext) return; + + if (!this.#liveEditingMode) { + if (this.getIsNew() === true) { + const blockCreated = this.#blockManager.createBlock( + this.#modalContext.data as UmbBlockWorkspaceData, + layoutData, + contentData.contentTypeKey, + ); + if (!blockCreated) { + throw new Error('Block Manager could not create block'); + return; + } + } + + // TODO: Save the block, but only in non-live-editing mode. + this.#blockManager.setOneLayout(layoutData); + + if (contentData) { + this.#blockManager.setOneContent(contentData); + } + const settingsData = this.settings.getData(); + if (settingsData) { + this.#blockManager.setOneSettings(settingsData); + } + } + + this.saveComplete(layoutData); + } + + #modalRejected = () => { + if (this.#liveEditingMode) { + // Revert + // Did it exist before? + if (this.getIsNew() === true) { + // Remove the block? + const contentUdi = this.#layout.value?.contentUdi; + if (contentUdi) { + this.#blockManager?.deleteBlock(contentUdi); + } + } + } + }; + + public destroy(): void { + this.#layout.destroy(); + } +} + +export default UmbBlockWorkspaceContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.element.ts new file mode 100644 index 0000000000..5e080011fe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.element.ts @@ -0,0 +1,85 @@ +import type { UmbBlockWorkspaceContext } from './block-workspace.context.js'; +import { UmbBlockWorkspaceEditorElement } from './block-workspace-editor.element.js'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbExtensionsApiInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { decodeFilePath } from '@umbraco-cms/backoffice/utils'; + +@customElement('umb-block-workspace') +export class UmbBlockWorkspaceElement extends UmbLitElement { + // + #manifest?: ManifestWorkspace; + #workspaceContext?: UmbBlockWorkspaceContext; + #editorElement = () => { + const element = new UmbBlockWorkspaceEditorElement(); + element.workspaceAlias = this.#manifest!.alias; + return element; + }; + + @state() + _routes: UmbRoute[] = []; + + public set manifest(manifest: ManifestWorkspace) { + this.#manifest = manifest; + createExtensionApi(manifest, [this, { manifest: manifest }]).then((context) => { + if (context) { + this.#gotWorkspaceContext(context); + // TODO: Do we need to recreate when ID changed? Or is that a responsibility of the context it self? + new UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'workspaceContext', [ + this, + this.#workspaceContext, + ]); + } + }); + } + + #gotWorkspaceContext(context: UmbApi) { + this.#workspaceContext = context as UmbBlockWorkspaceContext; + + this._routes = [ + { + path: 'create/:elementTypeKey', + component: this.#editorElement, + setup: async (_component, info) => { + const elementTypeKey = info.match.params.elementTypeKey; + this.#workspaceContext!.create(elementTypeKey); + + new UmbWorkspaceIsNewRedirectController( + this, + this.#workspaceContext!, + this.shadowRoot!.querySelector('umb-router-slot')!, + ); + }, + }, + { + path: 'edit/:udi', + component: this.#editorElement, + setup: (_component, info) => { + const udi = decodeFilePath(info.match.params.udi); + this.#workspaceContext!.load(udi); + }, + }, + ]; + } + + render() { + return html``; + } + + static styles = [UmbTextStyles]; +} + +export default UmbBlockWorkspaceElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-block-workspace': UmbBlockWorkspaceElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.modal-token.ts new file mode 100644 index 0000000000..0a2d21ccc1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/block-workspace.modal-token.ts @@ -0,0 +1,18 @@ +import type { UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbBlockWorkspaceData extends UmbWorkspaceData { + originData: OriginDataType; +} + +export const UMB_BLOCK_WORKSPACE_MODAL = new UmbModalToken( + 'Umb.Modal.Workspace', + { + modal: { + type: 'sidebar', + size: 'large', + }, + data: { entityType: 'block', preset: {}, originData: {} }, + // Recast the type, so the entityType data prop is not required: + }, +) as UmbModalToken, UmbWorkspaceValue>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/index.ts new file mode 100644 index 0000000000..533b373c45 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/index.ts @@ -0,0 +1,5 @@ +export * from './block-element-property-dataset.context-token.js'; +export * from './block-workspace.context-token.js'; +export * from './block-workspace.modal-token.js'; + +export const UMB_BLOCK_WORKSPACE_ALIAS = 'Umb.Workspace.Block'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts new file mode 100644 index 0000000000..9617a2bdcc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/manifests.ts @@ -0,0 +1,75 @@ +import { UMB_BLOCK_WORKSPACE_ALIAS } from './index.js'; +import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'workspaceAction', + alias: 'Umb.WorkspaceAction.Block.Save', + name: 'Save Block Type Workspace Action', + api: UmbSaveWorkspaceAction, + meta: { + label: 'Submit', + look: 'primary', + color: 'positive', + }, + conditions: [ + { + alias: 'Umb.Condition.WorkspaceAlias', + oneOf: [UMB_BLOCK_WORKSPACE_ALIAS], + }, + ], + }, + { + type: 'workspace', + name: 'Block List Type Workspace', + alias: UMB_BLOCK_WORKSPACE_ALIAS, + element: () => import('./block-workspace.element.js'), + api: () => import('./block-workspace.context.js'), + weight: 900, + meta: { + entityType: 'block', + }, + }, + { + type: 'workspaceView', + alias: 'Umb.WorkspaceView.Block.Content', + name: 'Block Workspace Content View', + js: () => import('./views/edit/block-workspace-view-edit.element.js'), + weight: 1000, + meta: { + label: 'Content', + pathname: 'content', + icon: 'icon-document', + blockElementManagerName: 'content', + }, + conditions: [ + { + alias: 'Umb.Condition.WorkspaceAlias', + match: UMB_BLOCK_WORKSPACE_ALIAS, + }, + ], + } as any, + { + type: 'workspaceView', + alias: 'Umb.WorkspaceView.Block.Settings', + name: 'Block Workspace Settings View', + js: () => import('./views/edit/block-workspace-view-edit.element.js'), + weight: 1000, + meta: { + label: 'Settings', + pathname: 'settings', + icon: 'icon-settings', + blockElementManagerName: 'settings', + }, + conditions: [ + { + alias: 'Umb.Condition.WorkspaceAlias', + match: UMB_BLOCK_WORKSPACE_ALIAS, + }, + { + alias: 'Umb.Condition.BlockWorkspaceHasSettings', + }, + ], + } as any, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-no-router.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-no-router.element.ts new file mode 100644 index 0000000000..255dd05e6f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-no-router.element.ts @@ -0,0 +1,143 @@ +import { UMB_BLOCK_WORKSPACE_CONTEXT } from '../../block-workspace.context-token.js'; +import './block-workspace-view-edit-tab.element.js'; +import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { PropertyTypeContainerModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; + +@customElement('umb-block-workspace-view-edit-no-router') +export class UmbBlockWorkspaceViewEditNoRouterElement extends UmbLitElement implements UmbWorkspaceViewElement { + //private _hasRootProperties = false; + + @state() + private _hasRootGroups = false; + + @state() + _tabs?: Array; + + @state() + private _activeTabId?: string | null | undefined; + + @state() + private _activeTabName?: string | null | undefined; + + private _workspaceContext?: typeof UMB_BLOCK_WORKSPACE_CONTEXT.TYPE; + + private _tabsStructureHelper = new UmbContentTypeContainerStructureHelper(this); + + constructor() { + super(); + + this._tabsStructureHelper.setIsRoot(true); + this._tabsStructureHelper.setContainerChildType('Tab'); + this.observe(this._tabsStructureHelper.containers, (tabs) => { + this._tabs = tabs; + this._checkDefaultTabName(); + }); + + // _hasRootProperties can be gotten via _tabsStructureHelper.hasProperties. But we do not support root properties currently. + + this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (workspaceContext) => { + this._workspaceContext = workspaceContext; + this._tabsStructureHelper.setStructureManager(workspaceContext.content.structure); + this._observeRootGroups(); + }); + } + + private _observeRootGroups() { + if (!this._workspaceContext) return; + + this.observe( + this._workspaceContext.content.structure.hasRootContainers('Group'), + (hasRootGroups) => { + this._hasRootGroups = hasRootGroups; + this._checkDefaultTabName(); + }, + '_observeGroups', + ); + } + + private _checkDefaultTabName() { + if (!this._tabs || !this._workspaceContext) return; + + // Find the default tab to grab: + if (this._activeTabId === undefined) { + if (this._tabs.length > 0) { + this._activeTabName = this._tabs[0].name; + this._activeTabId = this._tabs[0].id; + } + if (this._hasRootGroups) { + this._activeTabName = null; + this._activeTabId = null; + } + } + } + + #setTabName(tabName: string | undefined | null, tabId: string | null | undefined) { + this._activeTabName = tabName; + this._activeTabId = tabId; + } + + render() { + if (!this._tabs) return; + return html` + ${this._tabs.length > 1 || (this._tabs.length === 1 && this._hasRootGroups) + ? html` + ${this._hasRootGroups && this._tabs.length > 0 + ? html` + this.#setTabName(null, null)} + >Content + ` + : ''} + ${repeat( + this._tabs, + (tab) => tab.name, + (tab) => { + return html` this.#setTabName(tab.name, tab.id)} + >${tab.name}`; + }, + )} + ` + : ''} + ${this._activeTabId !== undefined + ? html` + ` + : ''} + `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + height: 100%; + --uui-tab-background: var(--uui-color-surface); + } + `, + ]; +} + +export default UmbBlockWorkspaceViewEditNoRouterElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-block-workspace-view-edit-no-router': UmbBlockWorkspaceViewEditNoRouterElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-properties.element.ts new file mode 100644 index 0000000000..d35fa40231 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-properties.element.ts @@ -0,0 +1,94 @@ +import { UMB_BLOCK_WORKSPACE_CONTEXT } from '../../block-workspace.context-token.js'; +import type { UmbBlockWorkspaceElementManagerNames } from '../../block-workspace.context.js'; +import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { + UmbPropertyContainerTypes, + UmbContentTypeModel, + UmbPropertyTypeModel, +} from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypePropertyStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +@customElement('umb-block-workspace-view-edit-properties') +export class UmbBlockWorkspaceViewEditPropertiesElement extends UmbLitElement { + @property({ attribute: false }) + public get managerName(): UmbBlockWorkspaceElementManagerNames | undefined { + return this.#managerName; + } + public set managerName(value: UmbBlockWorkspaceElementManagerNames | undefined) { + this.#managerName = value; + this.#setStructureManager(); + } + #managerName?: UmbBlockWorkspaceElementManagerNames; + #blockWorkspace?: typeof UMB_BLOCK_WORKSPACE_CONTEXT.TYPE; + #propertyStructureHelper = new UmbContentTypePropertyStructureHelper(this); + + @property({ type: String, attribute: 'container-name', reflect: false }) + public get containerName(): string | undefined { + return this.#propertyStructureHelper.getContainerName(); + } + public set containerName(value: string | undefined) { + this.#propertyStructureHelper.setContainerName(value); + } + + @property({ type: String, attribute: 'container-type', reflect: false }) + public get containerType(): UmbPropertyContainerTypes | undefined { + return this.#propertyStructureHelper.getContainerType(); + } + public set containerType(value: UmbPropertyContainerTypes | undefined) { + this.#propertyStructureHelper.setContainerType(value); + } + + @state() + _propertyStructure: Array = []; + + constructor() { + super(); + + this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#blockWorkspace = workspaceContext; + this.#setStructureManager(); + }); + } + + #setStructureManager() { + if (!this.#blockWorkspace || !this.#managerName) return; + this.#propertyStructureHelper.setStructureManager(this.#blockWorkspace[this.#managerName].structure); + this.observe( + this.#propertyStructureHelper.propertyStructure, + (propertyStructure) => { + this._propertyStructure = propertyStructure; + }, + 'observePropertyStructure', + ); + } + + render() { + return repeat( + this._propertyStructure, + (property) => property.alias, + (property) => html` `, + ); + } + + static styles = [ + UmbTextStyles, + css` + umb-property-type-based-property { + border-bottom: 1px solid var(--uui-color-divider); + } + umb-property-type-based-property:last-child { + border-bottom: 0; + } + `, + ]; +} + +export default UmbBlockWorkspaceViewEditPropertiesElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-block-workspace-view-edit-properties': UmbBlockWorkspaceViewEditPropertiesElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-tab.element.ts new file mode 100644 index 0000000000..03a27f78bc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit-tab.element.ts @@ -0,0 +1,146 @@ +import { UMB_BLOCK_WORKSPACE_CONTEXT } from '../../block-workspace.context-token.js'; +import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { PropertyTypeContainerModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; + +import './block-workspace-view-edit-properties.element.js'; +// eslint-disable-next-line import/order +import type { UmbBlockWorkspaceElementManagerNames } from '../../block-workspace.context.js'; + +@customElement('umb-block-workspace-view-edit-tab') +export class UmbBlockWorkspaceViewEditTabElement extends UmbLitElement { + @property({ attribute: false }) + public get managerName(): UmbBlockWorkspaceElementManagerNames | undefined { + return this.#managerName; + } + public set managerName(value: UmbBlockWorkspaceElementManagerNames | undefined) { + this.#managerName = value; + this.#setStructureManager(); + } + #managerName?: UmbBlockWorkspaceElementManagerNames; + #blockWorkspace?: typeof UMB_BLOCK_WORKSPACE_CONTEXT.TYPE; + #groupStructureHelper = new UmbContentTypeContainerStructureHelper(this); + + @property({ type: String }) + public get tabName(): string | undefined { + return this.#groupStructureHelper.getName(); + } + public set tabName(value: string | undefined) { + if (value === this._tabName) return; + const oldValue = this._tabName; + this._tabName = value; + this.#groupStructureHelper.setName(value); + this.requestUpdate('tabName', oldValue); + } + private _tabName?: string | undefined; + + @property({ type: Boolean }) + public get noTabName(): boolean { + return this.#groupStructureHelper.getIsRoot(); + } + public set noTabName(value: boolean) { + this.#groupStructureHelper.setIsRoot(value); + } + + private _ownerTabId?: string | null; + @property({ type: String }) + public get ownerTabId(): string | null | undefined { + return this._ownerTabId; + } + public set ownerTabId(value: string | null | undefined) { + if (value === this._ownerTabId) return; + this._ownerTabId = value; + this.#groupStructureHelper.setOwnerId(value); + } + + /** + * If true, the group box will be hidden, if we are to only represents one group. + * This is used by Inline Editing Mode of Block List Editor. + */ + @property({ type: Boolean, reflect: false }) + hideSingleGroup = false; + + @state() + _groups: Array = []; + + @state() + _hasProperties = false; + + constructor() { + super(); + + this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#blockWorkspace = workspaceContext; + this.#setStructureManager(); + }); + } + + #setStructureManager() { + if (!this.#blockWorkspace || !this.#managerName) return; + this.#groupStructureHelper.setStructureManager(this.#blockWorkspace[this.#managerName].structure); + this.observe( + this.#groupStructureHelper.containers, + (groups) => { + this._groups = groups; + }, + 'observeGroups', + ); + this.observe( + this.#groupStructureHelper.hasProperties, + (hasProperties) => { + this._hasProperties = hasProperties; + }, + 'observeHasProperties', + ); + } + + render() { + return html` + ${this._hasProperties ? this.#renderPart(this._tabName) : ''} + ${repeat( + this._groups, + (group) => group.name, + (group) => this.#renderPart(group.name, group.name), + )} + `; + } + + #renderPart(groupName: string | null | undefined, boxName?: string | null | undefined) { + return this.hideSingleGroup && this._groups.length === 1 + ? html` ` + : html` `; + } + + static styles = [ + UmbTextStyles, + css` + uui-box { + --uui-box-default-padding: 0 var(--uui-size-space-5); + } + uui-box:not(:first-child) { + margin-top: var(--uui-size-layout-1); + } + `, + ]; +} + +export default UmbBlockWorkspaceViewEditTabElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-block-workspace-view-edit-tab': UmbBlockWorkspaceViewEditTabElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit.element.ts new file mode 100644 index 0000000000..620007696a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/workspace/views/edit/block-workspace-view-edit.element.ts @@ -0,0 +1,189 @@ +import { UMB_BLOCK_WORKSPACE_CONTEXT } from '../../block-workspace.context-token.js'; +import type { UmbBlockWorkspaceElementManagerNames } from '../../block-workspace.context.js'; +import type { UmbBlockWorkspaceViewEditTabElement } from './block-workspace-view-edit-tab.element.js'; +import { css, html, customElement, state, repeat, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; +import type { UmbRoute, UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; +import { encodeFolderName } from '@umbraco-cms/backoffice/router'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { PropertyTypeContainerModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { ManifestWorkspaceView, UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; + +@customElement('umb-block-workspace-view-edit') +export class UmbBlockWorkspaceViewEditElement extends UmbLitElement implements UmbWorkspaceViewElement { + @property({ attribute: false }) + public get manifest(): ManifestWorkspaceView | undefined { + return; + } + public set manifest(value: ManifestWorkspaceView | undefined) { + this.#managerName = (value?.meta as any).blockElementManagerName ?? 'content'; + this.#setStructureManager(); + } + #managerName?: UmbBlockWorkspaceElementManagerNames; + #blockWorkspace?: typeof UMB_BLOCK_WORKSPACE_CONTEXT.TYPE; + #tabsStructureHelper = new UmbContentTypeContainerStructureHelper(this); + + //@state() + //private _hasRootProperties = false; + + @state() + private _hasRootGroups = false; + + @state() + private _routes: UmbRoute[] = []; + + @state() + _tabs?: Array; + + @state() + private _routerPath?: string; + + @state() + private _activePath = ''; + + constructor() { + super(); + + this.#tabsStructureHelper.setIsRoot(true); + this.#tabsStructureHelper.setContainerChildType('Tab'); + + // _hasRootProperties can be gotten via _tabsStructureHelper.hasProperties. But we do not support root properties currently. + + this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#blockWorkspace = workspaceContext; + this.#setStructureManager(); + }); + } + + #setStructureManager() { + if (!this.#blockWorkspace || !this.#managerName) return; + this.#tabsStructureHelper.setStructureManager(this.#blockWorkspace[this.#managerName].structure); + + this.observe( + this.#blockWorkspace![this.#managerName!].structure.hasRootContainers('Group'), + (hasRootGroups) => { + this._hasRootGroups = hasRootGroups; + this._createRoutes(); + }, + 'observeGroups', + ); + this.observe( + this.#tabsStructureHelper.containers, + (tabs) => { + this._tabs = tabs; + this._createRoutes(); + }, + 'observeTabs', + ); + } + + private _createRoutes() { + if (!this._tabs || !this.#blockWorkspace) return; + const routes: UmbRoute[] = []; + + if (this._tabs.length > 0) { + this._tabs?.forEach((tab) => { + const tabName = tab.name ?? ''; + routes.push({ + path: `tab/${encodeFolderName(tabName).toString()}`, + component: () => import('./block-workspace-view-edit-tab.element.js'), + setup: (component) => { + (component as UmbBlockWorkspaceViewEditTabElement).managerName = this.#managerName; + (component as UmbBlockWorkspaceViewEditTabElement).tabName = tabName; + // TODO: Consider if we can link these more simple, and not parse this on. + // Instead have the structure manager looking at wether one of the OwnerALikecontainers is in the owner document. + (component as UmbBlockWorkspaceViewEditTabElement).ownerTabId = this.#tabsStructureHelper.isOwnerContainer( + tab.id!, + ) + ? tab.id + : undefined; + }, + }); + }); + } + + if (this._hasRootGroups) { + routes.push({ + path: '', + component: () => import('./block-workspace-view-edit-tab.element.js'), + setup: (component) => { + (component as UmbBlockWorkspaceViewEditTabElement).managerName = this.#managerName; + (component as UmbBlockWorkspaceViewEditTabElement).noTabName = true; + (component as UmbBlockWorkspaceViewEditTabElement).ownerTabId = null; + }, + }); + } + + if (routes.length !== 0) { + routes.push({ + path: '', + redirectTo: routes[0]?.path, + }); + } + + this._routes = routes; + } + + render() { + if (!this._routes || !this._tabs) return; + return html` + + ${this._routerPath && (this._tabs.length > 1 || (this._tabs.length === 1 && this._hasRootGroups)) + ? html` + ${this._hasRootGroups && this._tabs.length > 0 + ? html` + Content + ` + : ''} + ${repeat( + this._tabs, + (tab) => tab.name, + (tab) => { + const path = this._routerPath + '/tab/' + encodeFolderName(tab.name || ''); + return html`${tab.name}`; + }, + )} + ` + : ''} + + { + this._routerPath = event.target.absoluteRouterPath; + }} + @change=${(event: UmbRouterSlotChangeEvent) => { + this._activePath = event.target.absoluteActiveViewPath || ''; + }}> + + + `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + height: 100%; + --uui-tab-background: var(--uui-color-surface); + } + `, + ]; +} + +export default UmbBlockWorkspaceViewEditElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-block-workspace-view-edit': UmbBlockWorkspaceViewEditElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/index.ts b/src/Umbraco.Web.UI.Client/src/packages/block/index.ts index 8428775ae0..36612a5435 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/index.ts @@ -1,6 +1,5 @@ export * from './block/index.js'; export * from './block-grid/index.js'; export * from './block-list/index.js'; -export * from './block-manager/index.js'; export * from './block-rte/index.js'; export * from './block-type/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/action/action-event.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/action/action-event.context.ts new file mode 100644 index 0000000000..6edcae712b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/action/action-event.context.ts @@ -0,0 +1,13 @@ +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbActionEventContext extends UmbContextBase { + constructor(host: UmbControllerHost) { + super(host, UMB_ACTION_EVENT_CONTEXT); + } +} + +export const UMB_ACTION_EVENT_CONTEXT = new UmbContextToken( + 'UmbActionEventContext', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/action/action.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/action/action.interface.ts index 06c5c958d7..15f9a133f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/action/action.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/action/action.interface.ts @@ -1,4 +1,4 @@ -import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export interface UmbAction extends UmbApi { repository?: RepositoryType; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/action/index.ts index b9a260ce0b..79e8f1b8b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/action/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/action/index.ts @@ -1,2 +1,3 @@ export * from './repository-action.js'; export * from './action.interface.js'; +export * from './action-event.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts index 0f4a178922..37875ffaef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts @@ -1,4 +1,4 @@ -import { type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import { type UmbApi, UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -12,18 +12,5 @@ export class UmbActionBase extends UmbBaseController implements new UmbExtensionApiInitializer(this, umbExtensionsRegistry, repositoryAlias, [this._host], (permitted, ctrl) => { this.repository = permitted ? (ctrl.api as RepositoryType) : undefined; }); - /*this.observe( - umbExtensionsRegistry.getByTypeAndAlias('repository', repositoryAlias), - async (repositoryManifest) => { - if (!repositoryManifest) return; - - try { - const result = await createExtensionApi(repositoryManifest, [this._host]); - this.repository = result as RepositoryType; - } catch (error) { - throw new Error('Could not create repository with alias: ' + repositoryAlias + ''); - } - } - );*/ } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/action/collection-action-button.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/action/collection-action-button.element.ts index 39e1d58e26..8ec442acac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/action/collection-action-button.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/action/collection-action-button.element.ts @@ -1,13 +1,10 @@ -import { UmbCollectionAction } from './collection-action-base.js'; +import type { UmbCollectionAction } from './collection-action-base.js'; import { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; import { html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { - umbExtensionsRegistry, - type ManifestCollectionAction, - UmbBackofficeManifestKind, -} from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbBackofficeManifestKind, ManifestCollectionAction } from '@umbraco-cms/backoffice/extension-registry'; import { createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; const manifest: UmbBackofficeManifestKind = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-alias.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-alias.condition.ts index df4879398b..f3befb71f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-alias.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-alias.condition.ts @@ -1,6 +1,6 @@ import { UMB_DEFAULT_COLLECTION_CONTEXT } from './default/collection-default.context.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { +import type { ManifestCondition, UmbConditionConfigBase, UmbConditionControllerArguments, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.test.ts index 15aff10e76..57bed25f32 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.test.ts @@ -2,7 +2,8 @@ import { expect } from '@open-wc/testing'; import { UmbCollectionViewManager } from './collection-view.manager.js'; import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; -import { ManifestCollectionView, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestCollectionView} from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { customElement } from '@umbraco-cms/backoffice/external/lit'; @customElement('test-my-controller-host') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.ts index 76acf7c624..67ff3afc51 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection-view.manager.ts @@ -1,9 +1,10 @@ import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbExtensionsManifestInitializer, createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; -import { ManifestCollectionView, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestCollectionView} from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbArrayState, UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; export interface UmbCollectionViewManagerConfig { defaultViewAlias?: string; @@ -33,7 +34,7 @@ export class UmbCollectionViewManager extends UmbBaseController { // TODO: hack - we need to figure out how to get the "parent path" from the router setTimeout(() => { const currentUrl = new URL(window.location.href); - this.#rootPathname.next(currentUrl.pathname.substring(0, currentUrl.pathname.lastIndexOf('/'))); + this.#rootPathname.setValue(currentUrl.pathname.substring(0, currentUrl.pathname.lastIndexOf('/'))); }, 100); } @@ -44,7 +45,7 @@ export class UmbCollectionViewManager extends UmbBaseController { * @memberof UmbCollectionContext */ public setCurrentView(view: ManifestCollectionView) { - this.#currentView.next(view); + this.#currentView.setValue(view); } /** @@ -59,7 +60,7 @@ export class UmbCollectionViewManager extends UmbBaseController { #observeViews() { return new UmbExtensionsManifestInitializer(this, umbExtensionsRegistry, 'collectionView', null, (views) => { const manifests = views.map((view) => view.manifest); - this.#views.next(manifests); + this.#views.setValue(manifests); this.#createRoutes(manifests); }); } @@ -88,6 +89,6 @@ export class UmbCollectionViewManager extends UmbBaseController { }); } - this.#routes.next(routes); + this.#routes.setValue(routes); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection.element.ts index ecd8901f57..10128d7f6d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/collection.element.ts @@ -1,7 +1,8 @@ -import { UmbCollectionContext } from './types.js'; +import type { UmbCollectionContext } from './types.js'; import { customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { ManifestCollection, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestCollection} from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { createExtensionApi, createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; @customElement('umb-collection') @@ -37,7 +38,7 @@ export class UmbCollectionElement extends UmbLitElement { async #createApi() { if (!this.#manifest) throw new Error('No manifest'); - const api = (await createExtensionApi(this.#manifest, [this])) as UmbCollectionContext; + const api = (await createExtensionApi(this.#manifest, [this])) as unknown as UmbCollectionContext; if (!api) throw new Error('No api'); api.setManifest(this.#manifest); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-action-bundle.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-action-bundle.element.ts index e7c2a15936..54d202153a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-action-bundle.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-action-bundle.element.ts @@ -1,4 +1,5 @@ -import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from '../default/collection-default.context.js'; +import type { UmbDefaultCollectionContext } from '../default/collection-default.context.js'; +import { UMB_DEFAULT_COLLECTION_CONTEXT } from '../default/collection-default.context.js'; import { html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-selection-actions.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-selection-actions.element.ts index c44ae64a25..4f1b45b66f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-selection-actions.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-selection-actions.element.ts @@ -1,7 +1,8 @@ -import { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; +import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; +import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-collection-selection-actions') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-view-bundle.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-view-bundle.element.ts index 10e529fb22..c9d61c8325 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-view-bundle.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/collection-view-bundle.element.ts @@ -1,5 +1,6 @@ -import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from '../default/collection-default.context.js'; -import { ManifestCollectionView } from '../../extension-registry/models/collection-view.model.js'; +import type { UmbDefaultCollectionContext } from '../default/collection-default.context.js'; +import { UMB_DEFAULT_COLLECTION_CONTEXT } from '../default/collection-default.context.js'; +import type { ManifestCollectionView } from '../../extension-registry/models/collection-view.model.js'; import { css, html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts index 52e4acc0c4..40576d6ba8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts @@ -1,7 +1,8 @@ -import { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, nothing, state } from '@umbraco-cms/backoffice/external/lit'; -import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; +import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; +import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-collection-pagination') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/dashboards/dashboard-collection.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/dashboards/dashboard-collection.stories.ts index 5feac03101..d5a25a93d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/dashboards/dashboard-collection.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/dashboards/dashboard-collection.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbDashboardCollectionElement } from './dashboard-collection.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts index 5e8e5a228f..65b19ef39c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.context.ts @@ -1,14 +1,16 @@ -import { UmbCollectionConfiguration, UmbCollectionContext } from '../types.js'; +import type { UmbCollectionConfiguration, UmbCollectionContext } from '../types.js'; import { UmbCollectionViewManager } from '../collection-view.manager.js'; -import { UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; -import { type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbArrayState, UmbNumberState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbApi, UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; -import { +import type { UmbApi} from '@umbraco-cms/backoffice/extension-api'; +import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestCollection, - ManifestRepository, + ManifestRepository} from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry, } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbCollectionFilterModel } from '@umbraco-cms/backoffice/collection'; @@ -99,8 +101,8 @@ export class UmbDefaultCollectionContext< const { data } = await this.repository.requestCollection(filter); if (data) { - this.#items.next(data.items); - this.#totalItems.next(data.total); + this.#items.setValue(data.items); + this.#totalItems.setValue(data.total); this.pagination.setTotalItems(data.total); } } @@ -111,14 +113,14 @@ export class UmbDefaultCollectionContext< * @memberof UmbCollectionContext */ public setFilter(filter: Partial) { - this.#filter.next({ ...this.#filter.getValue(), ...filter }); + this.#filter.setValue({ ...this.#filter.getValue(), ...filter }); this.requestCollection(); } #configure(configuration: UmbCollectionConfiguration) { this.selection.setMultiple(true); this.pagination.setPageSize(configuration.pageSize!); - this.#filter.next({ ...this.#filter.getValue(), skip: 0, take: configuration.pageSize }); + this.#filter.setValue({ ...this.#filter.getValue(), skip: 0, take: configuration.pageSize }); } #onPageChange = (event: UmbChangeEvent) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts index 916c945a5f..46220165f4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts @@ -1,7 +1,8 @@ import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from './collection-default.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { umbExtensionsRegistry, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/types.ts index 073962dd87..d3c9b5c8af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/types.ts @@ -1,6 +1,6 @@ -import { ManifestCollection } from '@umbraco-cms/backoffice/extension-registry'; -import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { UmbPaginationManager } from '@umbraco-cms/backoffice/utils'; +import type { ManifestCollection } from '@umbraco-cms/backoffice/extension-registry'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import type { UmbPaginationManager } from '@umbraco-cms/backoffice/utils'; export interface UmbCollectionConfiguration { pageSize?: number; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-modal-container/backoffice-modal-container.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-modal-container/backoffice-modal-container.element.ts index 90c6671e3a..71c9b4c005 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-modal-container/backoffice-modal-container.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-modal-container/backoffice-modal-container.element.ts @@ -1,10 +1,12 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, CSSResultGroup, html, repeat, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, repeat, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UmbModalElement, - UmbModalContext, + UmbModalContext} from '@umbraco-cms/backoffice/modal'; +import { + UMB_MODAL_MANAGER_CONTEXT, + UmbModalElement } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -21,7 +23,7 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this._modalManager = instance; this._observeModals(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-notification-container/backoffice-notification-container.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-notification-container/backoffice-notification-container.element.ts index f386b64cdb..07bbf076ea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-notification-container/backoffice-notification-container.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/backoffice-notification-container/backoffice-notification-container.element.ts @@ -1,14 +1,15 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, CSSResultGroup, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { - UmbNotificationHandler, - UmbNotificationContext, - UMB_NOTIFICATION_CONTEXT_TOKEN, -} from '@umbraco-cms/backoffice/notification'; +import type { CSSResultGroup } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, repeat, query } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbNotificationHandler, UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-backoffice-notification-container') export class UmbBackofficeNotificationContainerElement extends UmbLitElement { + @query('#notifications') + private _notificationsElement?: HTMLElement; + @state() private _notifications?: UmbNotificationHandler[]; @@ -17,7 +18,7 @@ export class UmbBackofficeNotificationContainerElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { this._notificationContext = instance; this._observeNotifications(); }); @@ -28,12 +29,22 @@ export class UmbBackofficeNotificationContainerElement extends UmbLitElement { this.observe(this._notificationContext.notifications, (notifications) => { this._notifications = notifications; + + // Close and instantly open the popover again to make sure it stays on top of all other content on the page + // TODO: This ignorer is just needed for JSON SCHEMA TO WORK, As its not updated with latest TS jet. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this._notificationsElement?.hidePopover?.(); // To prevent issues in FireFox I added `?.` before `()` [NL] + // TODO: This ignorer is just needed for JSON SCHEMA TO WORK, As its not updated with latest TS jet. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this._notificationsElement?.showPopover?.(); // To prevent issues in FireFox I added `?.` before `()` [NL] }); } render() { return html` - + ${this._notifications ? repeat( this._notifications, @@ -49,13 +60,19 @@ export class UmbBackofficeNotificationContainerElement extends UmbLitElement { UmbTextStyles, css` #notifications { - position: absolute; top: 0; left: 0; right: 0; - bottom: 70px; + bottom: 45px; height: auto; padding: var(--uui-size-layout-1); + + position: fixed; + width: 100vw; + background: 0; + outline: 0; + border: 0; + margin: 0; } `, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.stories.ts index c32feb03af..263c20954d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import { html } from '@umbraco-cms/backoffice/external/lit'; import './body-layout.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/code-block/code-block.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/code-block/code-block.stories.ts index 64c8b3f035..faefbc446e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/code-block/code-block.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/code-block/code-block.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './code-block.element.js'; import type { UmbCodeBlockElement } from './code-block.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/dropdown/dropdown.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/dropdown/dropdown.element.ts index ea66e6407f..dc38b830b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/dropdown/dropdown.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/dropdown/dropdown.element.ts @@ -1,19 +1,12 @@ -import { - InterfaceColor, - InterfaceLook, +import type { + UUIInterfaceColor, + UUIInterfaceLook, PopoverContainerPlacement, UUIPopoverContainerElement, } from '@umbraco-cms/backoffice/external/uui'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { - css, - html, - customElement, - property, - PropertyValueMap, - query, - when, -} from '@umbraco-cms/backoffice/external/lit'; +import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, query, when } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; // TODO: maybe move this to UI Library. @@ -28,10 +21,10 @@ export class UmbDropdownElement extends UmbLitElement { label = ''; @property() - look: InterfaceLook = 'default'; + look: UUIInterfaceLook = 'default'; @property() - color: InterfaceColor = 'default'; + color: UUIInterfaceColor = 'default'; @property() placement: PopoverContainerPlacement = 'bottom-start'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/empty-state/empty-state.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/empty-state/empty-state.stories.ts index 0f5ec49ad2..0d055828ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/empty-state/empty-state.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/empty-state/empty-state.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import { html } from '@umbraco-cms/backoffice/external/lit'; import './empty-state.element.js'; import type { UmbEmptyStateElement } from './empty-state.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.ts index 46bab98a29..3de9b99748 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/entity-actions-bundle/entity-actions-bundle.element.ts @@ -1,7 +1,8 @@ import { css, html, nothing, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; -import { UmbSectionSidebarContext, UMB_SECTION_SIDEBAR_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/section'; +import type { UmbSectionSidebarContext } from '@umbraco-cms/backoffice/section'; +import { UMB_SECTION_SIDEBAR_CONTEXT } from '@umbraco-cms/backoffice/section'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -35,7 +36,7 @@ export class UmbEntityActionsBundleElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_SECTION_SIDEBAR_CONTEXT_TOKEN, (sectionContext) => { + this.consumeContext(UMB_SECTION_SIDEBAR_CONTEXT, (sectionContext) => { this.#sectionSidebarContext = sectionContext; }); } @@ -43,7 +44,7 @@ export class UmbEntityActionsBundleElement extends UmbLitElement { #observeEntityActions() { this.observe( umbExtensionsRegistry - .extensionsOfType('entityAction') + .byType('entityAction') .pipe(map((actions) => actions.filter((action) => action.meta.entityTypes.includes(this.entityType!)))), (actions) => { this._hasActions = actions.length > 0; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts index 97c050d41e..155ab0333d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts @@ -1,5 +1,6 @@ import { type ManifestTypes, umbExtensionsRegistry } from '../../extension-registry/index.js'; -import { css, repeat, customElement, property, state, TemplateResult } from '@umbraco-cms/backoffice/external/lit'; +import type { TemplateResult } from '@umbraco-cms/backoffice/external/lit'; +import { css, repeat, customElement, property, state, html } from '@umbraco-cms/backoffice/external/lit'; import { type UmbExtensionElementInitializer, UmbExtensionsElementInitializer, @@ -121,11 +122,13 @@ export class UmbExtensionSlotElement extends UmbLitElement { } render() { - return repeat( - this._permittedExts, - (ext) => ext.alias, - (ext) => (this.renderMethod ? this.renderMethod(ext) : ext.component), - ); + return this._permittedExts.length > 0 + ? repeat( + this._permittedExts, + (ext) => ext.alias, + (ext) => (this.renderMethod ? this.renderMethod(ext) : ext.component), + ) + : html``; } static styles = css` diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.test.ts index 5ddeacecc9..f5d466601c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.test.ts @@ -1,8 +1,9 @@ import { expect, fixture, html } from '@open-wc/testing'; import { UmbExtensionSlotElement } from './extension-slot.element.js'; import { customElement } from '@umbraco-cms/backoffice/external/lit'; -import { ManifestDashboard, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbExtensionElementInitializer } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestDashboard} from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbExtensionElementInitializer } from '@umbraco-cms/backoffice/extension-api'; @customElement('umb-test-extension-slot-manifest-element') class UmbTestExtensionSlotManifestElement extends HTMLElement {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/footer-layout/footer-layout.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/footer-layout/footer-layout.stories.ts index ccc0743767..25e4a8d7a6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/footer-layout/footer-layout.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/footer-layout/footer-layout.stories.ts @@ -1,6 +1,6 @@ import './footer-layout.element.js'; -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbFooterLayoutElement } from './footer-layout.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/header-app/header-app-button.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/header-app/header-app-button.element.ts index 4a1a9970ca..0ab9ab24bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/header-app/header-app-button.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/header-app/header-app-button.element.ts @@ -1,8 +1,10 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, CSSResultGroup, html, LitElement, customElement, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import { +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, LitElement, customElement, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import type { ManifestHeaderAppButtonKind, - UmbBackofficeManifestKind, + UmbBackofficeManifestKind} from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry, } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/header-app/header-app.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/header-app/header-app.stories.ts index 2608e838fa..a092461abd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/header-app/header-app.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/header-app/header-app.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './header-app-button.element.js'; import type { UmbHeaderAppButtonElement } from './header-app-button.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/history/history-list.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/history/history-list.stories.ts index 0bced47aee..40ecb7ed3b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/history/history-list.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/history/history-list.stories.ts @@ -1,7 +1,7 @@ import './history-list.element.js'; import './history-item.element.js'; -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbHistoryListElement } from './history-list.element.js'; import type { UmbHistoryItemElement } from './history-item.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts index e03884ea26..50727337dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts @@ -11,13 +11,12 @@ export * from './extension-slot/index.js'; export * from './footer-layout/index.js'; export * from './header-app/index.js'; export * from './history/index.js'; -export * from './input-checkbox-list/index.js'; +export * from '../property-editor/uis/checkbox-list/input-checkbox-list/index.js'; export * from './input-color/index.js'; export * from './input-date/index.js'; export * from './input-dropdown/index.js'; export * from './input-eye-dropper/index.js'; export * from './input-list-base/index.js'; -export * from './input-markdown-editor/index.js'; export * from './input-multi-url/index.js'; export * from './input-number-range/index.js'; export * from './input-radio-button-list/index.js'; @@ -30,8 +29,5 @@ export * from './input-upload-field/index.js'; export * from './multiple-color-picker-input/index.js'; export * from './multiple-text-string-input/index.js'; export * from './popover-layout/index.js'; -export * from './property-type-based-property/index.js'; -export * from './ref-property-editor-ui/index.js'; export * from './table/index.js'; export * from './tooltip-menu/index.js'; -export * from './variant-selector/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.element.ts index ad5836627f..23a80ff85b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.element.ts @@ -1,5 +1,6 @@ import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUIColorSwatchesEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIColorSwatchesEvent } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbSwatchDetails } from '@umbraco-cms/backoffice/models'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.stories.ts index 2962c6c728..4a1c306eb6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-color/input-color.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-color.element.js'; import type { UmbInputColorElement } from './input-color.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.element.ts index 56fd3a4184..00fcb6368f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.element.ts @@ -1,6 +1,7 @@ import { UmbConfigRepository } from '../../repository/config/config.repository.js'; import { css, html, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-input-date') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.stories.ts index c2eec6dffa..5708eb8908 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-date/input-date.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import type { UmbInputDateElement } from './input-date.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; import './input-date.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.element.ts index 9b06a87c0a..f8e43a7634 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.element.ts @@ -1,5 +1,6 @@ import { css, html, customElement, property, query } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-input-dropdown-list') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.stories.ts index cabff86e72..c79fea4cc3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-dropdown/input-dropdown-list.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-dropdown-list.element.js'; import type { UmbInputDropdownListElement } from './input-dropdown-list.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-eye-dropper/input-eye-dropper.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-eye-dropper/input-eye-dropper.element.ts index 5ae5451b85..b6dd9ca20f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-eye-dropper/input-eye-dropper.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-eye-dropper/input-eye-dropper.element.ts @@ -1,5 +1,6 @@ import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUIColorPickerChangeEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIColorPickerChangeEvent } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-input-eye-dropper') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-eye-dropper/input-eye-dropper.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-eye-dropper/input-eye-dropper.stories.ts index d6a2916dd7..3b3e9a73c5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-eye-dropper/input-eye-dropper.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-eye-dropper/input-eye-dropper.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-eye-dropper.element.js'; import type { UmbInputEyeDropperElement } from './input-eye-dropper.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts index afe4762fad..969ccc4a50 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-list-base/input-list-base.ts @@ -1,11 +1,12 @@ import { html, property } from '@umbraco-cms/backoffice/external/lit'; import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; -import { +import type { UmbModalManagerContext, UmbModalToken, UmbModalType, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UmbPickerModalValue, + UmbPickerModalValue} from '@umbraco-cms/backoffice/modal'; +import { + UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -29,7 +30,7 @@ export class UmbInputListBaseElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.element.ts index 780019cb83..e0bf0b82ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.element.ts @@ -1,16 +1,17 @@ import { DOMPurify } from '@umbraco-cms/backoffice/external/dompurify'; import { marked } from '@umbraco-cms/backoffice/external/marked'; import { monaco } from '@umbraco-cms/backoffice/external/monaco-editor'; -import { UmbCodeEditorController, UmbCodeEditorElement, loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; +import type { UmbCodeEditorController, UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; +import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { css, html, customElement, query, property, unsafeHTML, when } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin, type UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { UMB_LINK_PICKER_MODAL, UMB_MEDIA_TREE_PICKER_MODAL, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT, } from '@umbraco-cms/backoffice/modal'; import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -47,7 +48,7 @@ export class UmbInputMarkdownElement extends FormControlMixin(UmbLitElement) { constructor() { super(); this.#loadCodeEditor(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this._modalContext = instance; }); this.consumeContext(UMB_APP_CONTEXT, (instance) => { @@ -67,7 +68,7 @@ export class UmbInputMarkdownElement extends FormControlMixin(UmbLitElement) { folding: false, }); // Prefer to update options before showing the editor, to avoid seeing the changes in the UI. - this.#isCodeEditorReady.next(true); + this.#isCodeEditorReady.setValue(true); this.#loadActions(); } catch (error) { console.error(error); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.stories.ts index 2659ff4a1d..b29e0d2338 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-markdown-editor/input-markdown.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-markdown.element.js'; import type { UmbInputMarkdownElement } from './input-markdown.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-multi-url/input-multi-url.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-multi-url/input-multi-url.element.ts index 86267f6c82..105c52c291 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-multi-url/input-multi-url.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-multi-url/input-multi-url.element.ts @@ -3,12 +3,8 @@ import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { - UmbLinkPickerLink, - UMB_LINK_PICKER_MODAL, - UmbModalRouteRegistrationController, -} from '@umbraco-cms/backoffice/modal'; -import type { UmbModalRouteBuilder } from '@umbraco-cms/backoffice/modal'; +import { UMB_LINK_PICKER_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; +import type { UmbModalRouteBuilder, UmbLinkPickerLink } from '@umbraco-cms/backoffice/modal'; /** * @element umb-input-multi-url @@ -109,6 +105,7 @@ export class UmbInputMultiUrlElement extends FormControlMixin(UmbLitElement) { constructor() { super(); + this.addValidator( 'rangeUnderflow', () => this.minMessage, @@ -155,7 +152,8 @@ export class UmbInputMultiUrlElement extends FormControlMixin(UmbLitElement) { queryString: data?.queryString, target: data?.target, trashed: data?.trashed, - udi: data?.udi, + type: data?.type, + unique: data?.unique, url: data?.url, }, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-multi-url/input-multi-url.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-multi-url/input-multi-url.stories.ts index 8878178389..1017d7d56d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-multi-url/input-multi-url.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-multi-url/input-multi-url.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-multi-url.element.js'; import type { UmbInputMultiUrlElement } from './input-multi-url.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.stories.ts index d5e5cff103..2058c85c27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-number-range/input-number-range.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-number-range.element.js'; import type { UmbInputNumberRangeElement } from './input-number-range.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.element.ts index 54fcc86ad7..62965e3b29 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.element.ts @@ -1,5 +1,6 @@ import { css, html, nothing, repeat, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-input-radio-button-list') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.stories.ts index a3eff6b851..be6c9cefc8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-radio-button-list/input-radio-button-list.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-radio-button-list.element.js'; import type { UmbInputRadioButtonListElement } from './input-radio-button-list.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.element.ts index 73427c9aca..1e1743c1ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.element.ts @@ -2,7 +2,8 @@ import { UmbInputListBaseElement } from '../input-list-base/input-list-base.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UMB_SECTION_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; -import { ManifestSection, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestSection } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-input-section') export class UmbInputSectionElement extends UmbInputListBaseElement { @@ -17,7 +18,7 @@ export class UmbInputSectionElement extends UmbInputListBaseElement { private _observeSections() { if (this.value.length > 0) { - this.observe(umbExtensionsRegistry.extensionsOfType('section'), (sections: Array) => { + this.observe(umbExtensionsRegistry.byType('section'), (sections: Array) => { this._sections = sections.filter((section) => this.value.includes(section.alias)); }); } else { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.stories.ts index b39e4966d8..67668efe91 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-section/input-section.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-section.element.js'; import type { UmbInputSectionElement } from './input-section.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.element.ts index 473e4d8498..aff0bf4aae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.element.ts @@ -1,5 +1,6 @@ import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUISliderEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUISliderEvent } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-input-slider') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.stories.ts index 06afd560ff..b1b841b526 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-slider/input-slider.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-slider.element.js'; import type { UmbInputSliderElement } from './input-slider.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/input-tiny-mce.defaults.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/input-tiny-mce.defaults.ts index 579cbf0b6d..76fe1fff55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/input-tiny-mce.defaults.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/input-tiny-mce.defaults.ts @@ -1,6 +1,5 @@ import type { RawEditorOptions } from '@umbraco-cms/backoffice/external/tinymce'; -//These are absolutely required in order for the macros to render inline //we put these as extended elements because they get merged on top of the normal allowed elements by tiny mce //so we don't have to specify all the normal elements again export const defaultFallbackConfig: RawEditorOptions = { @@ -23,7 +22,6 @@ export const defaultFallbackConfig: RawEditorOptions = { 'indent', 'link', 'umbmediapicker', - 'umbmacro', 'umbembeddialog', ], style_formats: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/input-tiny-mce.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/input-tiny-mce.element.ts index 7ef6f439f7..9546f892b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/input-tiny-mce.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/input-tiny-mce.element.ts @@ -3,25 +3,18 @@ import { pastePreProcessHandler } from './input-tiny-mce.handlers.js'; import { availableLanguages } from './input-tiny-mce.languages.js'; import { uriAttributeSanitizer } from './input-tiny-mce.sanitizer.js'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; -import { type Editor, type RawEditorOptions, renderEditor } from '@umbraco-cms/backoffice/external/tinymce'; -import { TinyMcePluginArguments, UmbTinyMcePluginBase } from '@umbraco-cms/backoffice/components'; +import type { Editor, RawEditorOptions } from '@umbraco-cms/backoffice/external/tinymce'; +import type { TinyMcePluginArguments, UmbTinyMcePluginBase } from '@umbraco-cms/backoffice/components'; import { loadManifestApi } from '@umbraco-cms/backoffice/extension-api'; -import { ManifestTinyMcePlugin, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { - PropertyValueMap, - css, - customElement, - html, - property, - query, - state, -} from '@umbraco-cms/backoffice/external/lit'; +import { type ManifestTinyMcePlugin, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, property, query, state } from '@umbraco-cms/backoffice/external/lit'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; import { UmbMediaHelper } from '@umbraco-cms/backoffice/utils'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; +import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; -import { UmbStylesheetRepository } from '@umbraco-cms/backoffice/stylesheet'; +import { UmbStylesheetDetailRepository, UmbStylesheetRuleManager } from '@umbraco-cms/backoffice/stylesheet'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-input-tiny-mce') @@ -32,16 +25,32 @@ export class UmbInputTinyMceElement extends FormControlMixin(UmbLitElement) { @state() private _tinyConfig: RawEditorOptions = {}; + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + #renderEditor?: typeof import('@umbraco-cms/backoffice/external/tinymce').renderEditor; #mediaHelper = new UmbMediaHelper(); #plugins: Array UmbTinyMcePluginBase> = []; #editorRef?: Editor | null = null; - #stylesheetRepository?: UmbStylesheetRepository; + #stylesheetRepository: UmbStylesheetDetailRepository; #serverUrl?: string; + #umbStylesheetRuleManager = new UmbStylesheetRuleManager(); protected getFormElement() { return this._editorElement?.querySelector('iframe') ?? undefined; } + set value(newValue: FormDataEntryValue | FormData) { + super.value = newValue; + const newContent = newValue?.toString() ?? ''; + + if (this.#editorRef && this.#editorRef.getContent() != newContent) { + this.#editorRef.setContent(newContent); + } + } + + get value(): FormDataEntryValue | FormData { + return super.value; + } + @query('#editor', true) private _editorElement?: HTMLElement; @@ -52,12 +61,17 @@ export class UmbInputTinyMceElement extends FormControlMixin(UmbLitElement) { this.#serverUrl = instance.getServerUrl(); }); - this.#stylesheetRepository = new UmbStylesheetRepository(this); + this.#stylesheetRepository = new UmbStylesheetDetailRepository(this); } protected async firstUpdated(_changedProperties: PropertyValueMap | Map): Promise { super.firstUpdated(_changedProperties); - await this.#loadPlugins(); + + // Here we want to start the loading of everything at first, not one at a time, which is why this code is not using await. + const loadEditor = import('@umbraco-cms/backoffice/external/tinymce').then((tinyMce) => { + this.#renderEditor = tinyMce.renderEditor; + }); + await Promise.all([loadEditor, ...(await this.#loadPlugins())]); await this.#setTinyConfig(); } @@ -77,74 +91,95 @@ export class UmbInputTinyMceElement extends FormControlMixin(UmbLitElement) { * the plugins are ready and so are not associated with the editor. */ async #loadPlugins() { - const observable = umbExtensionsRegistry?.extensionsOfType('tinyMcePlugin'); + const observable = umbExtensionsRegistry?.byType('tinyMcePlugin'); const manifests = (await firstValueFrom(observable)) as ManifestTinyMcePlugin[]; + const promises = []; for (const manifest of manifests) { - const plugin = manifest.js - ? await loadManifestApi(manifest.js) - : manifest.api - ? await loadManifestApi(manifest.api) - : undefined; - if (plugin) { - this.#plugins.push(plugin); + if (manifest.js) { + promises.push( + loadManifestApi(manifest.js).then((plugin) => { + if (plugin) { + this.#plugins.push(plugin); + } + }), + ); + } + if (manifest.api) { + promises.push( + loadManifestApi(manifest.api).then((plugin) => { + if (plugin) { + this.#plugins.push(plugin); + } + }), + ); } } + return promises; } - async getFormatStyles(stylesheetPath: Array) { - const rules: any[] = []; + async getFormatStyles(stylesheetPaths: Array) { + if (!stylesheetPaths) return []; + const formatStyles: any[] = []; - stylesheetPath.forEach((path) => { - this.#stylesheetRepository?.getStylesheetRules(path).then(({ data }) => { - data?.rules?.forEach((rule) => { - const r: { - title?: string; - inline?: string; - classes?: string; - attributes?: Record; - block?: string; - } = { - title: rule.name, - }; + const promises = stylesheetPaths.map((path) => this.#stylesheetRepository?.requestByUnique(path)); + const stylesheetResponses = await Promise.all(promises); - if (!rule.selector) return; + stylesheetResponses.forEach(({ data }) => { + if (!data) return; + const rulesFromContent = this.#umbStylesheetRuleManager.extractRules(data.content); - if (rule.selector.startsWith('.')) { - r.inline = 'span'; - r.classes = rule.selector.substring(1); - } else if (rule.selector.startsWith('#')) { - r.inline = 'span'; - r.attributes = { id: rule.selector.substring(1) }; - } else if (rule.selector.includes('.')) { - const [block, ...classes] = rule.selector.split('.'); - r.block = block; - r.classes = classes.join(' ').replace(/\./g, ' '); - } else if (rule.selector.includes('#')) { - const [block, id] = rule.selector.split('#'); - r.block = block; - r.classes = id; - } else { - r.block = rule.selector; - } + rulesFromContent.forEach((rule) => { + const r: { + title?: string; + inline?: string; + classes?: string; + attributes?: Record; + block?: string; + } = { + title: rule.name, + }; - rules.push(r); - }); + if (!rule.selector) return; + + if (rule.selector.startsWith('.')) { + r.inline = 'span'; + r.classes = rule.selector.substring(1); + } else if (rule.selector.startsWith('#')) { + r.inline = 'span'; + r.attributes = { id: rule.selector.substring(1) }; + } else if (rule.selector.includes('.')) { + const [block, ...classes] = rule.selector.split('.'); + r.block = block; + r.classes = classes.join(' ').replace(/\./g, ' '); + } else if (rule.selector.includes('#')) { + const [block, id] = rule.selector.split('#'); + r.block = block; + r.classes = id; + } else { + r.block = rule.selector; + } + + formatStyles.push(r); }); }); - return rules; + return formatStyles; } async #setTinyConfig() { const dimensions = this.configuration?.getValueByAlias<{ width?: number; height?: number }>('dimensions'); + const stylesheetPaths = this.configuration?.getValueByAlias('stylesheets') ?? []; + const styleFormats = await this.getFormatStyles(stylesheetPaths); + // Map the stylesheets with server url const stylesheets = - this.configuration - ?.getValueByAlias('stylesheets') - ?.map((stylesheetPath: string) => `${this.#serverUrl}/css/${stylesheetPath.replace(/\\/g, '/')}`) ?? []; - const styleFormats = await this.getFormatStyles(stylesheets); + stylesheetPaths?.map( + (stylesheetPath: string) => `${this.#serverUrl}/css/${stylesheetPath.replace(/\\/g, '/')}`, + ) ?? []; + + stylesheets.push('/umbraco/backoffice/css/rte-content.css'); // create an object by merging the configuration onto the fallback config const configurationOptions: RawEditorOptions = { @@ -206,7 +241,10 @@ export class UmbInputTinyMceElement extends FormControlMixin(UmbLitElement) { this.#editorRef.destroy(); } - const editors = await renderEditor(this._tinyConfig); + if (!this.#renderEditor) { + throw new Error('TinyMCE renderEditor is not loaded'); + } + const editors = await this.#renderEditor(this._tinyConfig); this.#editorRef = editors.pop(); } @@ -335,6 +373,11 @@ export class UmbInputTinyMceElement extends FormControlMixin(UmbLitElement) { .tox .tox-collection__item-label { line-height: 1 !important; } + + /* Solves issue 1019 by lowering un-needed z-index on header.*/ + .tox.tox-tinymce .tox-editor-header { + z-index: 0; + } `, ]; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/tiny-mce-plugin.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/tiny-mce-plugin.ts index bb6dd2f8f4..ca0d3ff4d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/tiny-mce-plugin.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tiny-mce/tiny-mce-plugin.ts @@ -1,6 +1,6 @@ import type { UmbInputTinyMceElement } from '@umbraco-cms/backoffice/components'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import type { Editor } from '@umbraco-cms/backoffice/external/tinymce'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.element.ts index d05088d86f..c4417ca01c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.element.ts @@ -1,5 +1,6 @@ import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-input-toggle') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.stories.ts index 7d33c2947a..570d926332 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-toggle/input-toggle.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './input-toggle.element.js'; import type { UmbInputToggleElement } from './input-toggle.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tree-picker-source/input-tree-picker-source.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tree-picker-source/input-tree-picker-source.element.ts index 90f59172a5..c7337d6cac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tree-picker-source/input-tree-picker-source.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-tree-picker-source/input-tree-picker-source.element.ts @@ -1,26 +1,28 @@ -import { UmbInputDocumentPickerRootElement } from '@umbraco-cms/backoffice/document'; -import { html, customElement, property, css, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbInputDocumentPickerRootElement } from '@umbraco-cms/backoffice/document'; +import { html, customElement, property, css, state, nothing } from '@umbraco-cms/backoffice/external/lit'; +import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; -//import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; export type UmbTreePickerSource = { - type?: UmbTreePickerSourceType; - id?: string | null; - dynamicRoot?: UmbTreePickerDynamicRoot | null; + type: UmbTreePickerSourceType; + id?: string; + dynamicRoot?: UmbTreePickerDynamicRoot; }; export type UmbTreePickerSourceType = 'content' | 'member' | 'media'; export type UmbTreePickerDynamicRoot = { originAlias: string; - querySteps?: Array | null; + originKey?: string; + querySteps?: Array; }; export type UmbTreePickerDynamicRootQueryStep = { + unique: string; alias: string; - anyOfDocTypeKeys: Array; + anyOfDocTypeKeys?: Array; }; @customElement('umb-input-tree-picker-source') @@ -29,33 +31,33 @@ export class UmbInputTreePickerSourceElement extends FormControlMixin(UmbLitElem return undefined; } - private _type: UmbTreePickerSource['type'] = 'content'; + #type: UmbTreePickerSourceType = 'content'; @property() - public set type(value: UmbTreePickerSource['type']) { + public set type(value: UmbTreePickerSourceType) { if (value === undefined) { - value = this._type; + value = this.#type; } - const oldValue = this._type; + const oldValue = this.#type; this._options = this._options.map((option) => option.value === value ? { ...option, selected: true } : { ...option, selected: false }, ); - this._type = value; + this.#type = value; this.requestUpdate('type', oldValue); } - public get type(): UmbTreePickerSource['type'] { - return this._type; + public get type(): UmbTreePickerSourceType { + return this.#type; } @property({ attribute: 'node-id' }) - nodeId?: string | null; + nodeId?: string; @property({ attribute: false }) - dynamicRoot?: UmbTreePickerDynamicRoot | null; + dynamicRoot?: UmbTreePickerDynamicRoot | undefined; @state() _options: Array
-
+
${this._templateQuery?.resultCount ?? 0} items returned, in ${this._templateQuery?.executionTime ?? 0} ms + ${this._templateQuery?.sampleResults.map( + (sample) => html`${sample.name}`, + ) ?? ''}
${this._templateQuery?.queryExpression ?? ''} @@ -321,6 +325,16 @@ export default class UmbChooseInsertTypeModalElement extends UmbModalBaseElement #results-count { font-weight: bold; } + .query-results { + flex-direction: column; + align-items: flex-start; + gap: 0; + } + .query-results span { + display: flex; + align-items: center; + gap: var(--uui-size-1); + } `, ]; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/utils.ts index 1ccd3bdbca..78622b7be0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/modals/query-builder/utils.ts @@ -1,8 +1,9 @@ -import { - OperatorModel, +import type { TemplateQueryExecuteSortModel, TemplateQueryOperatorModel, - TemplateQueryPropertyPresentationModel, + TemplateQueryPropertyPresentationModel} from '@umbraco-cms/backoffice/backend-api'; +import { + OperatorModel, TemplateQueryPropertyTypeModel, UserOrderModel, } from '@umbraco-cms/backoffice/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/manifests.ts index 274063b931..dddfa7a795 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/manifests.ts @@ -1,7 +1,7 @@ import { UmbTemplateRepository } from '../repository/template.repository.js'; import { UmbTemplateStore } from './template.store.js'; import { UmbTemplateItemStore } from './template-item.store.js'; -import { ManifestStore, ManifestRepository, ManifestItemStore } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestStore, ManifestRepository, ManifestItemStore } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_TEMPLATE_REPOSITORY_ALIAS = 'Umb.Repository.Template'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/index.ts index 82d6fb4830..9d339c4fda 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/index.ts @@ -1,9 +1,9 @@ -import type { DataSourceResponse, UmbPagedData } from '@umbraco-cms/backoffice/repository'; +import type { DataSourceResponse, UmbPagedModel } from '@umbraco-cms/backoffice/repository'; import type { ItemResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbEntityTreeItemModel } from '@umbraco-cms/backoffice/tree'; +import type { UmbEntityTreeItemModel } from '@umbraco-cms/backoffice/tree'; export interface TemplateTreeDataSource { - getRootItems(): Promise>>; - getChildrenOf(parentId: string): Promise>>; + getRootItems(): Promise>>; + getChildrenOf(parentId: string): Promise>>; getItems(ids: Array): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.detail.server.data.ts index d531f2d8a6..1a24030f9e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.detail.server.data.ts @@ -1,9 +1,10 @@ -import { +import type { TemplateResponseModel, - TemplateResource, CreateTemplateRequestModel, UpdateTemplateRequestModel, - TemplateScaffoldResponseModel, + TemplateScaffoldResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { + TemplateResource } from '@umbraco-cms/backoffice/backend-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/templating/templates/repository/sources/template.item.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.item.server.data.ts index 319979677a..ec984e027e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.item.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.item.server.data.ts @@ -1,5 +1,6 @@ import type { UmbItemDataSource } from '@umbraco-cms/backoffice/repository'; -import { TemplateItemResponseModel, TemplateResource } from '@umbraco-cms/backoffice/backend-api'; +import type { TemplateItemResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { TemplateResource } from '@umbraco-cms/backoffice/backend-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/templating/templates/repository/sources/template.query-builder.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.query-builder.server.data.ts index ea043493d4..af553f73e3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.query-builder.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/sources/template.query-builder.server.data.ts @@ -1,4 +1,5 @@ -import { TemplateQueryExecuteModel, TemplateResource } from '@umbraco-cms/backoffice/backend-api'; +import type { TemplateQueryExecuteModel} from '@umbraco-cms/backoffice/backend-api'; +import { TemplateResource } from '@umbraco-cms/backoffice/backend-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/templating/templates/repository/template-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template-item.store.ts index dbe169ea3b..436c4383d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template-item.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/template-item.store.ts @@ -1,35 +1,23 @@ -import { TemplateItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { TemplateItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbItemStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbEntityItemStore } from '@umbraco-cms/backoffice/store'; /** * @export * @class UmbTemplateItemStore - * @extends {UmbStoreBase} + * @extends {UmbEntityItemStore} * @description - Data Store for Template items */ -export class UmbTemplateItemStore - extends UmbStoreBase - implements UmbItemStore -{ +export class UmbTemplateItemStore extends UmbEntityItemStore { /** * Creates an instance of UmbTemplateItemStore. * @param {UmbControllerHostElement} host * @memberof UmbTemplateItemStore */ constructor(host: UmbControllerHostElement) { - super( - host, - UMB_TEMPLATE_ITEM_STORE_CONTEXT.toString(), - new UmbArrayState([], (x) => x.id), - ); - } - - items(ids: Array) { - return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? ''))); + super(host, UMB_TEMPLATE_ITEM_STORE_CONTEXT.toString()); } } 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 ed44e7295b..64da0e0b18 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 @@ -1,28 +1,28 @@ -import { UmbTemplateTreeStore, UMB_TEMPLATE_TREE_STORE_CONTEXT } from '../tree/index.js'; -import { UmbTemplateStore, UMB_TEMPLATE_STORE_CONTEXT } from './template.store.js'; +import type { UmbTemplateTreeStore} from '../tree/index.js'; +import { UMB_TEMPLATE_TREE_STORE_CONTEXT } from '../tree/index.js'; +import type { UmbTemplateStore} from './template.store.js'; +import { UMB_TEMPLATE_STORE_CONTEXT } from './template.store.js'; import { UmbTemplateDetailServerDataSource } from './sources/template.detail.server.data.js'; -import { UMB_TEMPLATE_ITEM_STORE_CONTEXT, UmbTemplateItemStore } from './template-item.store.js'; +import type { UmbTemplateItemStore } from './template-item.store.js'; +import { UMB_TEMPLATE_ITEM_STORE_CONTEXT } from './template-item.store.js'; import { UmbTemplateItemServerDataSource } from './sources/template.item.server.data.js'; import { UmbTemplateQueryBuilderServerDataSource } from './sources/template.query-builder.server.data.js'; -import type { UmbDetailRepository, UmbItemDataSource, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbItemDataSource, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbNotificationContext} from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import type { CreateTemplateRequestModel, TemplateItemResponseModel, TemplateQueryExecuteModel, - TemplateResponseModel, UpdateTemplateRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export class UmbTemplateRepository extends UmbBaseController - implements - UmbDetailRepository, - UmbItemRepository, - UmbApi + implements UmbItemRepository, UmbApi { #init; @@ -56,7 +56,7 @@ export class UmbTemplateRepository this.#store = instance; }), - this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { this.#notificationContext = instance; }), ]); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts index 9c3d943c41..ca6e077e34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts @@ -1,6 +1,7 @@ import { UMB_TEMPLATE_ENTITY_TYPE, UMB_TEMPLATE_ROOT_ENTITY_TYPE } from '../entity.js'; import { UmbTemplateTreeRepository } from './template-tree.repository.js'; import { UmbTemplateTreeStore } from './template-tree.store.js'; +import { manifests as reloadTreeItemChildrenManifest } from './reload-tree-item-children/manifests.js'; import type { ManifestRepository, ManifestTree, @@ -45,4 +46,4 @@ const treeItem: ManifestTreeItem = { }, }; -export const manifests = [treeRepository, treeStore, tree, treeItem]; +export const manifests = [treeRepository, treeStore, tree, treeItem, ...reloadTreeItemChildrenManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/reload-tree-item-children/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/reload-tree-item-children/manifests.ts new file mode 100644 index 0000000000..180da25ef5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/reload-tree-item-children/manifests.ts @@ -0,0 +1,23 @@ +import { + UMB_TEMPLATE_ROOT_ENTITY_TYPE, + UMB_TEMPLATE_ENTITY_TYPE, + UMB_TEMPLATE_FOLDER_ENTITY_TYPE, +} from '../../entity.js'; +import { UmbReloadTreeItemChildrenEntityAction } from '@umbraco-cms/backoffice/tree'; +import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'entityAction', + alias: 'Umb.EntityAction.Template.Tree.ReloadTreeItemChildren', + name: 'Reload Template Tree Item Children Entity Action', + weight: 10, + api: UmbReloadTreeItemChildrenEntityAction, + meta: { + icon: 'icon-refresh', + label: 'Reload children...', + repositoryAlias: 'Umb.Repository.Template.Tree', + entityTypes: [UMB_TEMPLATE_ROOT_ENTITY_TYPE, UMB_TEMPLATE_ENTITY_TYPE, UMB_TEMPLATE_FOLDER_ENTITY_TYPE], + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.repository.ts index e52ec2dda5..4fa3640b12 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.repository.ts @@ -1,10 +1,10 @@ import { UMB_TEMPLATE_ROOT_ENTITY_TYPE } from '../entity.js'; import { UmbTemplateTreeServerDataSource } from './template-tree.server.data-source.js'; -import { UmbTemplateTreeItemModel, UmbTemplateTreeRootModel } from './types.js'; +import type { UmbTemplateTreeItemModel, UmbTemplateTreeRootModel } from './types.js'; import { UMB_TEMPLATE_TREE_STORE_CONTEXT } from './template-tree.store.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'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export class UmbTemplateTreeRepository extends UmbTreeRepositoryBase @@ -15,13 +15,11 @@ export class UmbTemplateTreeRepository } async requestTreeRoot() { - const data = { + const data: UmbTemplateTreeRootModel = { id: null, entityType: UMB_TEMPLATE_ROOT_ENTITY_TYPE, name: 'Templates', - icon: 'icon-folder', hasChildren: true, - isContainer: false, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.server.data-source.ts index a4cc424383..6988211379 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.server.data-source.ts @@ -1,6 +1,10 @@ -import { UmbTemplateTreeItemModel } from './types.js'; +import type { UmbTemplateTreeItemModel } from './types.js'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; -import { EntityTreeItemResponseModel, TemplateResource } from '@umbraco-cms/backoffice/backend-api'; +import type { + EntityTreeItemResponseModel, + NamedEntityTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { TemplateResource } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -10,7 +14,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; * @implements {UmbTreeDataSource} */ export class UmbTemplateTreeServerDataSource extends UmbTreeServerDataSourceBase< - EntityTreeItemResponseModel, + NamedEntityTreeItemResponseModel, UmbTemplateTreeItemModel > { /** @@ -41,13 +45,12 @@ const getChildrenOf = (parentUnique: string | null) => { } }; -const mapper = (item: EntityTreeItemResponseModel): UmbTemplateTreeItemModel => { +const mapper = (item: NamedEntityTreeItemResponseModel): UmbTemplateTreeItemModel => { return { id: item.id, - parentId: item.parentId || null, + parentId: item.parent ? item.parent.id : null, name: item.name, entityType: 'template', - isContainer: item.isContainer, hasChildren: item.hasChildren, isFolder: false, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.store.ts index 06d57947ae..a878f3eb9b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/tree'; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts index e28271d172..9875952e80 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts @@ -1,16 +1,17 @@ import type { UmbTemplatingInsertMenuElement } from '../../components/insert-menu/templating-insert-menu.element.js'; import { UMB_MODAL_TEMPLATING_INSERT_SECTION_MODAL } from '../../modals/insert-section-modal/insert-section-modal.element.js'; import { UMB_TEMPLATE_QUERY_BUILDER_MODAL } from '../modals/modal-tokens.js'; -import { getQuerySnippet } from '../../utils.js'; +import { getQuerySnippet } from '../../utils/index.js'; import { UMB_TEMPLATE_WORKSPACE_CONTEXT } from './template-workspace.context.js'; import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { camelCase } from '@umbraco-cms/backoffice/external/lodash'; -import { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, query, state, nothing, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import type { + UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; import { - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_TEMPLATE_PICKER_MODAL, - UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT, + UMB_TEMPLATE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { Subject, debounceTime } from '@umbraco-cms/backoffice/external/rxjs'; @@ -45,7 +46,7 @@ export class UmbTemplateWorkspaceEditorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this._modalContext = instance; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts index 25f6b50ac5..b64a6e09c4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts @@ -1,19 +1,24 @@ import { UmbTemplateRepository } from '../repository/index.js'; import { UmbTemplateTreeRepository } from '../tree/index.js'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; +import type { + UmbSaveableWorkspaceContextInterface} from '@umbraco-cms/backoffice/workspace'; import { - UmbSaveableWorkspaceContextInterface, UmbEditableWorkspaceContextBase, } from '@umbraco-cms/backoffice/workspace'; import { UmbBooleanState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { TemplateItemResponseModel, TemplateResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbId } from '@umbraco-cms/backoffice/id'; export class UmbTemplateWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbEditableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface { + // + public readonly repository: UmbTemplateRepository = new UmbTemplateRepository(this); + #data = new UmbObjectState(undefined); data = this.#data.asObservable(); #masterTemplate = new UmbObjectState(null); @@ -28,17 +33,17 @@ export class UmbTemplateWorkspaceContext isCodeEditorReady = this.#isCodeEditorReady.asObservable(); // TODO: temp solution until we have automatic tree updates - #treeRepository = new UmbTemplateTreeRepository(this.host); + #treeRepository = new UmbTemplateTreeRepository(this); - constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Workspace.Template', new UmbTemplateRepository(host)); + constructor(host: UmbControllerHost) { + super(host, 'Umb.Workspace.Template'); this.#loadCodeEditor(); } async #loadCodeEditor() { try { await loadCodeEditor(); - this.#isCodeEditorReady.next(true); + this.#isCodeEditorReady.setValue(true); } catch (error) { console.error(error); } @@ -81,20 +86,20 @@ export class UmbTemplateWorkspaceContext if (data) { this.setIsNew(false); this.setMasterTemplate(data.masterTemplateId ?? null); - this.#data.next(data); + this.#data.setValue(data); } } async setMasterTemplate(id: string | null) { if (id === null) { - this.#masterTemplate.next(null); + this.#masterTemplate.setValue(null); this.#updateMasterTemplateLayoutBlock(); return null; } const { data } = await this.repository.requestItems([id]); if (data) { - this.#masterTemplate.next(data[0]); + this.#masterTemplate.setValue(data[0]); this.#updateMasterTemplateLayoutBlock(); return data[0]; } @@ -135,7 +140,10 @@ ${currentContent}`; const isNew = this.getIsNew(); if (isNew && template) { + const key = UmbId.new(); + this.#data.update({ id: key }); await this.repository.create({ + key: key, name: template.name, content: template.content, alias: template.alias, @@ -163,7 +171,7 @@ ${currentContent}`; const { data } = await this.repository.createScaffold(parentId); if (!data) return; this.setIsNew(true); - this.#data.next({ ...data, id: '', name: '', alias: '' }); + this.#data.setValue({ ...data, id: '', name: '', alias: '' }); if (!parentId) return; await this.setMasterTemplate(parentId); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/utils/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/templating/utils.ts rename to src/Umbraco.Web.UI.Client/src/packages/templating/utils/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/manifests.ts index 28644423d9..62024e27f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/manifests.ts @@ -1,4 +1,4 @@ -import { ManifestDashboard } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestDashboard } from '@umbraco-cms/backoffice/extension-registry'; export const dashboard: ManifestDashboard = { type: 'dashboard', diff --git a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.stories.ts index c8a8360271..f02a7b7f7a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.stories.ts @@ -1,6 +1,6 @@ import './umbraco-news-dashboard.element.js'; -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import type { UmbUmbracoNewsDashboardElement } from './umbraco-news-dashboard.element.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; 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 b5f5fe9eda..f3a58e2921 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 @@ -1,8 +1,10 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, CSSResultGroup, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import type { + UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; import { - UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT, UMB_CURRENT_USER_MODAL, } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -19,7 +21,7 @@ export class UmbCurrentUserHeaderAppElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManagerContext = instance; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-history.store.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-history.store.ts index bc96926eac..e24ac6f72b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-history.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-history.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbId } from '@umbraco-cms/backoffice/id'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; @@ -20,7 +20,7 @@ export class UmbCurrentUserHistoryStore extends UmbStoreBase([], (x) => x.unique), ); if (!('navigation' in window)) return; @@ -47,7 +47,7 @@ export class UmbCurrentUserHistoryStore extends UmbStoreBase( +export const UMB_CURRENT_USER_HISTORY_STORE_CONTEXT = new UmbContextToken( 'UmbCurrentUserHistoryStore', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user.context.ts index 710fbf4b4f..f891318a6d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user.context.ts @@ -1,7 +1,7 @@ -import { UmbCurrentUser } from './types.js'; +import type { UmbCurrentUser } from './types.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-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'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; import { UserResource } from '@umbraco-cms/backoffice/backend-api'; @@ -25,17 +25,8 @@ export class UmbCurrentUserContext extends UmbBaseController { this.#observeIsAuthorized(); }); - // TODO: revisit this. It can probably be simplified - this.observe(umbLocalizationRegistry.isDefaultLoaded, (isDefaultLoaded) => { - if (!isDefaultLoaded) return; - - this.observe( - this.languageIsoCode, - (currentLanguageIsoCode) => { - umbLocalizationRegistry.loadLanguage(currentLanguageIsoCode); - }, - 'umbCurrentUserLanguageIsoCode', - ); + this.observe(this.languageIsoCode, (currentLanguageIsoCode) => { + umbLocalizationRegistry.loadLanguage(currentLanguageIsoCode); }); this.provideContext(UMB_CURRENT_USER_CONTEXT, this); @@ -45,7 +36,7 @@ export class UmbCurrentUserContext extends UmbBaseController { // TODO: use repository const { data, error } = await tryExecuteAndNotify(this._host, UserResource.getUserCurrent()); // TODO: add current user store - this.#currentUser.next(data); + this.#currentUser.setValue(data); return { data, error }; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user/current-user-modal.element.ts index 6e24fdd099..ff429117d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user/current-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user/current-user-modal.element.ts @@ -1,10 +1,11 @@ import { UMB_CURRENT_USER_CONTEXT } from '../../current-user.context.js'; -import { type UmbCurrentUser } from '../../types.js'; +import type { UmbCurrentUser } from '../../types.js'; import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, CSSResultGroup, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbModalContext } from '@umbraco-cms/backoffice/modal'; +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbModalContext } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-current-user-modal') @@ -54,10 +55,7 @@ export class UmbCurrentUserModalElement extends UmbLitElement { private async _logout() { if (!this.#authContext) return; - await this.#authContext.signOut(); - let newUrl = this.#appContext ? `${this.#appContext.getBackofficePath()}/login` : '/'; - newUrl = newUrl.replace(/\/\//g, '/'); - location.href = newUrl; + this.#authContext.signOut(); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/manifests.ts index bc3f9d482a..98d5a2e84e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/manifests.ts @@ -1,4 +1,4 @@ -import { ManifestUserProfileApp } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestUserProfileApp } from '@umbraco-cms/backoffice/extension-registry'; export const userProfileApps: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-history.element.ts index 71a07a10df..041c5eba84 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-history.element.ts @@ -1,7 +1,8 @@ -import { +import type { UmbCurrentUserHistoryItem, - UmbCurrentUserHistoryStore, - UMB_CURRENT_USER_HISTORY_STORE_CONTEXT_TOKEN, + UmbCurrentUserHistoryStore} from '../current-user-history.store.js'; +import { + UMB_CURRENT_USER_HISTORY_STORE_CONTEXT, } from '../current-user-history.store.js'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -17,7 +18,7 @@ export class UmbUserProfileAppHistoryElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_CURRENT_USER_HISTORY_STORE_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_CURRENT_USER_HISTORY_STORE_CONTEXT, (instance) => { this.#currentUserHistoryStore = instance; this.#observeHistory(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-profile.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-profile.element.ts index 9ba96391be..599d63d859 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-profile.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-profile.element.ts @@ -1,10 +1,11 @@ import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { + UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; import { - UmbModalManagerContext, UMB_CHANGE_PASSWORD_MODAL, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT, } from '@umbraco-cms/backoffice/modal'; import { UMB_CURRENT_USER_CONTEXT, type UmbCurrentUser } from '@umbraco-cms/backoffice/current-user'; @@ -19,7 +20,7 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManagerContext = instance; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-themes.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-themes.element.ts index 0700f90bb9..f38d8a247f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-themes.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-themes.element.ts @@ -1,8 +1,10 @@ -import { UmbThemeContext, UMB_THEME_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/themes'; +import type { UmbThemeContext } from '@umbraco-cms/backoffice/themes'; +import { UMB_THEME_CONTEXT } from '@umbraco-cms/backoffice/themes'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { ManifestTheme, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTheme } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-user-profile-app-themes') export class UmbUserProfileAppThemesElement extends UmbLitElement { @@ -16,7 +18,7 @@ export class UmbUserProfileAppThemesElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_THEME_CONTEXT_TOKEN, (context) => { + this.consumeContext(UMB_THEME_CONTEXT, (context) => { this.#themeContext = context; this.observe( context.theme, @@ -27,7 +29,7 @@ export class UmbUserProfileAppThemesElement extends UmbLitElement { ); this.observe( - umbExtensionsRegistry.extensionsOfType('theme'), + umbExtensionsRegistry.byType('theme'), (themes) => { this._themes = themes; }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts index bfa34694e9..12ed90a23c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts @@ -1,6 +1,6 @@ import { UMB_CURRENT_USER_CONTEXT } from '../current-user.context.js'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export const isCurrentUser = async (host: UmbControllerHost, userId: string) => { let currentUserContext: typeof UMB_CURRENT_USER_CONTEXT.TYPE | undefined; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/modals/change-password/change-password-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/modals/change-password/change-password-modal.element.ts index 4b6f32389b..12c37d9482 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/modals/change-password/change-password-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/modals/change-password/change-password-modal.element.ts @@ -1,10 +1,12 @@ import { UmbUserItemRepository } from '../../user/repository/item/user-item.repository.js'; import { UMB_CURRENT_USER_CONTEXT } from '../../current-user/current-user.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, CSSResultGroup, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { +import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbChangePasswordModalData, - UmbChangePasswordModalValue, + UmbChangePasswordModalValue} from '@umbraco-cms/backoffice/modal'; +import { UmbModalBaseElement, } from '@umbraco-cms/backoffice/modal'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/action/manifests.ts index 9e6be0ecc3..1153828d5c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/action/manifests.ts @@ -1,5 +1,5 @@ import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const createManifest: ManifestTypes = { type: 'collectionAction', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/components/user-group-table-name-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/components/user-group-table-name-column-layout.element.ts index e8988bbdbe..912a78edb0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/components/user-group-table-name-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/components/user-group-table-name-column-layout.element.ts @@ -1,5 +1,5 @@ import { html, LitElement, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTableItem } from '@umbraco-cms/backoffice/components'; +import type { UmbTableItem } from '@umbraco-cms/backoffice/components'; @customElement('umb-user-group-table-name-column-layout') export class UmbUserGroupTableNameColumnLayoutElement extends LitElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/components/user-group-table-sections-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/components/user-group-table-sections-column-layout.element.ts index b49b2f22a8..d39ed9f6c0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/components/user-group-table-sections-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/components/user-group-table-sections-column-layout.element.ts @@ -22,7 +22,7 @@ export class UmbUserGroupTableSectionsColumnLayoutElement extends UmbLitElement private observeSectionNames() { this.observe( - umbExtensionsRegistry.extensionsOfType('section'), + umbExtensionsRegistry.byType('section'), (sections) => { this._sectionsNames = sections.filter((x) => this.value.includes(x.alias)).map((x) => x.meta.label || x.name); }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/manifests.ts index b7f03262a8..27480c73b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/manifests.ts @@ -4,7 +4,7 @@ import { } from './repository/manifests.js'; import { manifests as collectionViewManifests } from './views/manifests.js'; import { manifests as collectionActionManifests } from './action/manifests.js'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_USER_GROUP_COLLECTION_ALIAS = 'Umb.Collection.UserGroup'; const collection: ManifestTypes = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/manifests.ts index d24823703b..a158d4b754 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/manifests.ts @@ -1,5 +1,5 @@ import { UmbUserGroupCollectionRepository } from './user-group-collection.repository.js'; -import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_USER_GROUP_COLLECTION_REPOSITORY_ALIAS = 'Umb.Repository.UserGroupCollection'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.repository.ts index fba21ddbfc..4191d87bd3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.repository.ts @@ -1,9 +1,10 @@ -import { UmbUserGroupCollectionFilterModel } from '../../types.js'; -import { UMB_USER_GROUP_STORE_CONTEXT_TOKEN, UmbUserGroupStore } from '../../repository/user-group.store.js'; +import type { UmbUserGroupCollectionFilterModel } from '../../types.js'; +import type { UmbUserGroupStore } from '../../repository/user-group.store.js'; +import { UMB_USER_GROUP_STORE_CONTEXT } from '../../repository/user-group.store.js'; import { UmbUserGroupCollectionServerDataSource } from './user-group-collection.server.data-source.js'; -import { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbCollectionDataSource, UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbCollectionDataSource, UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; export class UmbUserGroupCollectionRepository extends UmbBaseController implements UmbCollectionRepository { @@ -16,7 +17,7 @@ export class UmbUserGroupCollectionRepository extends UmbBaseController implemen super(host); this.#collectionSource = new UmbUserGroupCollectionServerDataSource(this._host); - this.#init = this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT_TOKEN, (instance) => { + this.#init = this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT, (instance) => { this.#detailStore = instance; }).asPromise(); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts index 56cfece714..90f7a2b6d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts @@ -2,7 +2,8 @@ import type { UmbUserGroupCollectionFilterModel } from '../../types.js'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { UserGroupResponseModel, UserGroupResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { UserGroupResource } from '@umbraco-cms/backoffice/backend-api'; /** * A data source for the UserGroup that fetches data from the server diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/manifests.ts index ac5e3bc10c..f60f868c07 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/manifests.ts @@ -1,5 +1,5 @@ import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; -import { ManifestCollectionView } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestCollectionView } from '@umbraco-cms/backoffice/extension-registry'; const tableCollectionView: ManifestCollectionView = { type: 'collectionView', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts index c0efa4a779..87647d5881 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts @@ -1,13 +1,14 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; +import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; +import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import '../components/user-group-table-name-column-layout.element.js'; import '../components/user-group-table-sections-column-layout.element.js'; -import { +import type { UmbTableColumn, UmbTableConfig, UmbTableDeselectedEvent, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.stories.ts index df4a14f36e..f2871f2e8b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import type { UmbUserGroupInputElement } from './user-group-input.element.js'; import './user-group-input.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts index 9001c994ef..ad89f8484d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts @@ -1,7 +1,8 @@ import { UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; import { customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import { ManifestUserPermission, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; /** @@ -24,7 +25,7 @@ export class UmbUserGroupRefElement extends UmbElementMixin(UUIRefNodeElement) { async #observeUserPermissions(value: Array) { if (value) { this.observe( - umbExtensionsRegistry.extensionsOfType('userPermission').pipe( + umbExtensionsRegistry.byType('userPermission').pipe( map((manifests) => { return manifests.filter((manifest) => manifest.alias && value.includes(manifest.alias)); }), diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/entity-actions/manifests.ts index 93884ed4e7..3785a69729 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/entity-actions/manifests.ts @@ -1,7 +1,7 @@ import { UMB_USER_GROUP_REPOSITORY_ALIAS } from '../repository/manifests.js'; import { UMB_USER_GROUP_ENTITY_TYPE } from '../index.js'; import { UmbDeleteEntityAction } from '@umbraco-cms/backoffice/entity-action'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/entity-bulk-actions/delete/delete.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/entity-bulk-actions/delete/delete.action.ts index db9c68eea5..e6fa13b837 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/entity-bulk-actions/delete/delete.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/entity-bulk-actions/delete/delete.action.ts @@ -3,11 +3,8 @@ import { html } from '@umbraco-cms/backoffice/external/lit'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { - UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_CONFIRM_MODAL, -} from '@umbraco-cms/backoffice/modal'; +import type { UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; export class UmbDeleteUserGroupEntityBulkAction extends UmbEntityBulkActionBase { #modalContext?: UmbModalManagerContext; @@ -15,7 +12,7 @@ export class UmbDeleteUserGroupEntityBulkAction extends UmbEntityBulkActionBase< constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); - new UmbContextConsumerController(host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(host, UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts index 667593c6fa..d8237e7bff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts @@ -2,9 +2,10 @@ import { UmbUserGroupCollectionRepository } from '../../collection/repository/in import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; -import { UMB_USER_GROUP_PICKER_MODAL, UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UMB_USER_GROUP_PICKER_MODAL} from '@umbraco-cms/backoffice/modal'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui'; import { UmbSelectedEvent, UmbDeselectedEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-user-group-picker-modal') export class UmbUserGroupPickerModalElement extends UmbModalBaseElement< diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/sources/user-group-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/sources/user-group-item.server.data-source.ts index eeceaf190e..c7a8325165 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/sources/user-group-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/sources/user-group-item.server.data-source.ts @@ -1,7 +1,8 @@ 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 { UserGroupItemResponseModel, UserGroupResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupItemResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { UserGroupResource } from '@umbraco-cms/backoffice/backend-api'; /** * A data source for user group items that fetches data from the server diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/sources/user-group.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/sources/user-group.server.data-source.ts index 648c52a99d..11d0618d14 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/sources/user-group.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/sources/user-group.server.data-source.ts @@ -1,10 +1,11 @@ -import { UmbUserGroupDetailDataSource } from '../../types.js'; +import type { UmbUserGroupDetailDataSource } from '../../types.js'; import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; -import { +import type { UserGroupResponseModel, - UserGroupResource, UpdateUserGroupRequestModel, - CreateUserGroupRequestModel, + CreateUserGroupRequestModel} from '@umbraco-cms/backoffice/backend-api'; +import { + UserGroupResource } from '@umbraco-cms/backoffice/backend-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/user/user-group/repository/user-group-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group-item.store.ts index 4b8731794d..ca32c765b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group-item.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group-item.store.ts @@ -1,38 +1,24 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbItemStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbEntityItemStore } from '@umbraco-cms/backoffice/store'; import type { UserGroupItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; /** * @export * @class UmbUserGroupItemStore - * @extends {UmbStoreBase} + * @extends {UmbEntityItemStore} * @description - Data Store for user group items */ -export class UmbUserGroupItemStore - extends UmbStoreBase - implements UmbItemStore -{ +export class UmbUserGroupItemStore extends UmbEntityItemStore { /** * Creates an instance of UmbUserGroupItemStore. * @param {UmbControllerHostElement} host * @memberof UmbUserGroupItemStore */ constructor(host: UmbControllerHostElement) { - super( - host, - UMB_USER_GROUP_ITEM_STORE_CONTEXT_TOKEN.toString(), - new UmbArrayState([], (x) => x.id), - ); - } - - items(ids: Array) { - return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? ''))); + super(host, UMB_USER_GROUP_ITEM_STORE_CONTEXT.toString()); } } -export const UMB_USER_GROUP_ITEM_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbUserGroupItemStore', -); +export const UMB_USER_GROUP_ITEM_STORE_CONTEXT = new UmbContextToken('UmbUserGroupItemStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group.repository.ts index 0a08b643e3..049f98058a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group.repository.ts @@ -1,33 +1,26 @@ -import { UmbUserGroupDetailDataSource } from '../types.js'; +import type { UmbUserGroupDetailDataSource } from '../types.js'; import { UmbUserGroupServerDataSource } from './sources/user-group.server.data-source.js'; -import { UMB_USER_GROUP_ITEM_STORE_CONTEXT_TOKEN, UmbUserGroupItemStore } from './user-group-item.store.js'; +import type { UmbUserGroupItemStore } from './user-group-item.store.js'; +import { UMB_USER_GROUP_ITEM_STORE_CONTEXT } from './user-group-item.store.js'; import { UmbUserGroupItemServerDataSource } from './sources/user-group-item.server.data-source.js'; -import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { - CreateUserGroupRequestModel, - UpdateUserGroupRequestModel, - UserGroupItemResponseModel, - UserGroupResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; -import { - UmbDetailRepository, +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import type { UserGroupItemResponseModel, UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbItemDataSource, UmbItemRepository, UmbDataSourceErrorResponse, DataSourceResponse, } from '@umbraco-cms/backoffice/repository'; -import { UMB_NOTIFICATION_CONTEXT_TOKEN, UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; // TODO: implement export class UmbUserGroupRepository extends UmbBaseController - implements - UmbDetailRepository, - UmbItemRepository, - UmbApi + implements UmbItemRepository, UmbApi { #init; @@ -46,16 +39,16 @@ export class UmbUserGroupRepository this.#init = Promise.all([ /* - this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT, (instance) => { this.#detailStore = instance; }).asPromise(), */ - this.consumeContext(UMB_USER_GROUP_ITEM_STORE_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_USER_GROUP_ITEM_STORE_CONTEXT, (instance) => { this.#itemStore = instance; }).asPromise(), - this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { this.#notificationContext = instance; }).asPromise(), ]); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group.store.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group.store.ts index 8ca9044e7c..f30f5f0a5a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/user-group.store.ts @@ -1,10 +1,10 @@ import type { UserGroupDetails } from '../types.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -export const UMB_USER_GROUP_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbUserGroupStore'); +export const UMB_USER_GROUP_STORE_CONTEXT = new UmbContextToken('UmbUserGroupStore'); /** * @export @@ -14,6 +14,6 @@ export const UMB_USER_GROUP_STORE_CONTEXT_TOKEN = new UmbContextToken([], (x) => x.id)); + super(host, UMB_USER_GROUP_STORE_CONTEXT.toString(), new UmbArrayState([], (x) => x.id)); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/section-view/user-group-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/section-view/user-group-section-view.element.ts index 868554092e..887f736aad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/section-view/user-group-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/section-view/user-group-section-view.element.ts @@ -2,7 +2,7 @@ import { UMB_USER_GROUP_COLLECTION_ALIAS } from '../collection/index.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-user-group-section-view') export class UmbUserGroupSectionViewElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts index 0865ee481c..c6bf45112c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/types.ts @@ -1,10 +1,10 @@ -import { +import type { CreateUserGroupRequestModel, UpdateUserGroupRequestModel, UserGroupResponseModel, } from '@umbraco-cms/backoffice/backend-api'; import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; -import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; export interface UserGroupEntity extends UmbEntityBase { type: 'user-group'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts index 271b089fde..53643bcfc4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts @@ -2,7 +2,7 @@ import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from '../user-group-workspace.contex import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-user-group-default-permission-list') @@ -32,7 +32,7 @@ export class UmbUserGroupDefaultPermissionListElement extends UmbLitElement { #observeUserPermissions() { this.observe( - umbExtensionsRegistry.extensionsOfType('userPermission'), + umbExtensionsRegistry.byType('userPermission'), (userPermissionManifests) => { this._entityTypes = [...new Set(userPermissionManifests.map((manifest) => manifest.meta.entityType))]; }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index 4ed1e1bb76..eeabca24bd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -1,7 +1,7 @@ import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from '../user-group-workspace.context.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-user-group-granular-permission-list') diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts index 86fc9f3e77..726a26dd4c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts @@ -1,15 +1,16 @@ import { UMB_USER_GROUP_ENTITY_TYPE } from '../index.js'; import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from './user-group-workspace.context.js'; -import { UmbUserInputElement } from '@umbraco-cms/backoffice/user'; -import { UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbUserInputElement } from '@umbraco-cms/backoffice/user'; +import type { UUIInputElement} from '@umbraco-cms/backoffice/external/uui'; +import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; -import { UmbInputSectionElement } from '@umbraco-cms/backoffice/components'; -import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; -import { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; +import type { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; +import type { UmbInputSectionElement } from '@umbraco-cms/backoffice/components'; +import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; import './components/user-group-default-permission-list.element.js'; import './components/user-group-granular-permission-list.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index 66469140a3..2ae5dde3ab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -1,18 +1,22 @@ import { UmbUserGroupRepository } from '../repository/user-group.repository.js'; import { UmbUserRepository } from '../../user/repository/user.repository.js'; +import type { + UmbSaveableWorkspaceContextInterface} from '@umbraco-cms/backoffice/workspace'; import { - UmbSaveableWorkspaceContextInterface, UmbEditableWorkspaceContextBase, } from '@umbraco-cms/backoffice/workspace'; import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbUserGroupWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbEditableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface { + // + public readonly repository: UmbUserGroupRepository = new UmbUserGroupRepository(this); + #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -21,8 +25,8 @@ export class UmbUserGroupWorkspaceContext #userRepository: UmbUserRepository; - constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Workspace.UserGroup', new UmbUserGroupRepository(host)); + constructor(host: UmbControllerHost) { + super(host, 'Umb.Workspace.UserGroup'); this.#userRepository = new UmbUserRepository(host); } @@ -31,7 +35,7 @@ export class UmbUserGroupWorkspaceContext const { data } = await this.repository.createScaffold(null); this.setIsNew(true); // TODO: Should the data be the base model or the presentation model? - this.#data.next(data as unknown as UserGroupResponseModel); + this.#data.setValue(data as unknown as UserGroupResponseModel); return { data }; } @@ -108,7 +112,7 @@ export class UmbUserGroupWorkspaceContext } updateUserKeys(keys: Array) { - this.#userIds.next(keys); + this.#userIds.setValue(keys); } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts index b8cfe02734..fcf0879a5f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts @@ -1,8 +1,10 @@ -import { UmbChangeEvent, UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; -import { ManifestUserPermission, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { ManifestUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { css, html, customElement, property, state, nothing, ifDefined } from '@umbraco-cms/backoffice/external/lit'; -import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { UmbUserPermissionSettingElement } from '@umbraco-cms/backoffice/user'; +import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbUserPermissionSettingElement } from '@umbraco-cms/backoffice/user'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-entity-user-permission-settings-list') @@ -34,7 +36,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { this.#manifestObserver?.destroy(); this.#manifestObserver = this.observe( - umbExtensionsRegistry.extensionsOfType('userPermission'), + umbExtensionsRegistry.byType('userPermission'), (userPermissionManifests) => { this._manifests = userPermissionManifests.filter((manifest) => manifest.meta.entityType === this.entityType); }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts index 74e1a3d0f8..b5329783c5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts @@ -1,6 +1,6 @@ import { UMB_CURRENT_USER_CONTEXT } from '../../current-user/current-user.context.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { +import type { ManifestCondition, UmbConditionConfigBase, UmbConditionControllerArguments, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts index 1c049604f4..0eb6f69665 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts @@ -1,11 +1,12 @@ import { html, customElement, css, nothing, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { +import type { UmbEntityUserPermissionSettingsModalData, - UmbEntityUserPermissionSettingsModalValue, + UmbEntityUserPermissionSettingsModalValue} from '@umbraco-cms/backoffice/modal'; +import { UmbModalBaseElement, } from '@umbraco-cms/backoffice/modal'; -import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-entity-user-permission-settings-modal') export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseElement< diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/action/create-user.collection-action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/action/create-user.collection-action.ts index 0a011eb75e..568acb00bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/action/create-user.collection-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/action/create-user.collection-action.ts @@ -1,9 +1,10 @@ import { UmbCollectionActionBase } from '@umbraco-cms/backoffice/collection'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { + UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; import { UMB_CREATE_USER_MODAL, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbCreateUserCollectionAction extends UmbCollectionActionBase { @@ -12,7 +13,7 @@ export class UmbCreateUserCollectionAction extends UmbCollectionActionBase { constructor(host: UmbControllerHost) { super(host); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManagerContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/action/manifests.ts index 84999d72b4..262f90e0dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/action/manifests.ts @@ -1,6 +1,6 @@ import { UmbCreateUserCollectionAction } from './create-user.collection-action.js'; import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const createManifest: ManifestTypes = { type: 'collectionAction', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/manifests.ts index b0932b7032..b0eb080a20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/manifests.ts @@ -3,7 +3,7 @@ import { manifests as collectionRepositoryManifests } from './repository/manifes import { manifests as collectionViewManifests } from './views/manifests.js'; import { manifests as collectionActionManifests } from './action/manifests.js'; import { UmbUserCollectionContext } from './user-collection.context.js'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_USER_COLLECTION_ALIAS = 'Umb.Collection.User'; const collectionManifest: ManifestTypes = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/manifests.ts index ec781d9f09..122f7e3dee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/manifests.ts @@ -1,5 +1,5 @@ import { UmbUserCollectionRepository } from './user-collection.repository.js'; -import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_USER_COLLECTION_REPOSITORY_ALIAS = 'Umb.Repository.UserCollection'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/types.ts index 06282b9841..ca175d9029 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/types.ts @@ -1,5 +1,5 @@ -import { UmbUserCollectionFilterModel, UmbUserDetailModel } from '../../types.js'; -import { UmbCollectionDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbUserCollectionFilterModel, UmbUserDetailModel } from '../../types.js'; +import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/repository'; export interface UmbUserCollectionDataSource extends UmbCollectionDataSource {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.repository.ts index b7e3e4717a..a142f1c7b9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.repository.ts @@ -1,8 +1,8 @@ -import { UmbUserCollectionFilterModel } from '../../types.js'; +import type { UmbUserCollectionFilterModel } from '../../types.js'; import { UmbUserRepositoryBase } from '../../repository/user-repository-base.js'; import { UmbUserCollectionServerDataSource } from './user-collection.server.data-source.js'; -import { UmbUserCollectionDataSource } from './types.js'; -import { UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbUserCollectionDataSource } from './types.js'; +import type { UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbUserCollectionRepository extends UmbUserRepositoryBase implements UmbCollectionRepository { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts index 17d28ea782..b42a8d8c28 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts @@ -1,7 +1,8 @@ -import { type UmbUserCollectionFilterModel, type UmbUserDetailModel } from '../../types.js'; +import type { UmbUserCollectionFilterModel, UmbUserDetailModel } from '../../types.js'; import { UMB_USER_ENTITY_TYPE } from '../../entity.js'; -import { UmbCollectionDataSource } from '@umbraco-cms/backoffice/repository'; -import { UserResource, UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UserResource } from '@umbraco-cms/backoffice/backend-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/user/user/collection/user-collection-header.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts index 2c1bd1da4d..06c781d607 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts @@ -1,5 +1,5 @@ -import { UmbUserCollectionContext } from './user-collection.context.js'; -import { +import type { UmbUserCollectionContext } from './user-collection.context.js'; +import type { UUIBooleanInputEvent, UUICheckboxElement, UUIRadioGroupElement, @@ -8,8 +8,9 @@ import { import { css, html, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; -import { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; -import { UserGroupResponseModel, UserOrderModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import type { UserGroupResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { UserOrderModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbUserGroupCollectionRepository } from '@umbraco-cms/backoffice/user-group'; @customElement('umb-user-collection-header') diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection.context.ts index 03373333b4..d2b30f2fa3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection.context.ts @@ -1,8 +1,8 @@ -import { UmbUserCollectionFilterModel, UmbUserDetailModel } from '../types.js'; +import type { UmbUserCollectionFilterModel, UmbUserDetailModel } from '../types.js'; import { UMB_COLLECTION_VIEW_USER_GRID } from './views/index.js'; import { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; -import { UserOrderModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UserOrderModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export class UmbUserCollectionContext extends UmbDefaultCollectionContext< UmbUserDetailModel, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts index e8947ff0fc..044984e9de 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts @@ -1,11 +1,12 @@ import { getDisplayStateFromUserStatus } from '../../../../utils.js'; -import { UmbUserCollectionContext } from '../../user-collection.context.js'; -import { type UmbUserDetailModel } from '../../../types.js'; +import type { UmbUserCollectionContext } from '../../user-collection.context.js'; +import type { UmbUserDetailModel } from '../../../types.js'; import { css, html, nothing, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UserGroupResponseModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbUserGroupCollectionRepository } from '@umbraco-cms/backoffice/user-group'; @customElement('umb-user-grid-collection-view') diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/manifests.ts index 7dbe123656..bcdccca167 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/manifests.ts @@ -1,5 +1,5 @@ import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; -import { ManifestCollectionView } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestCollectionView } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_COLLECTION_VIEW_USER_TABLE = 'Umb.CollectionView.User.Table'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts index f0b3f2dace..a0d4a01bf1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts @@ -1,8 +1,8 @@ -import { UmbUserCollectionContext } from '../../user-collection.context.js'; +import type { UmbUserCollectionContext } from '../../user-collection.context.js'; import type { UmbUserDetailModel } from '../../../types.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { +import type { UmbTableElement, UmbTableColumn, UmbTableDeselectedEvent, @@ -17,7 +17,7 @@ import { UmbUserGroupRepository } from '@umbraco-cms/backoffice/user-group'; import './column-layouts/name/user-table-name-column-layout.element.js'; import './column-layouts/status/user-table-status-column-layout.element.js'; -import { UserGroupItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-user-table-collection-view') export class UmbUserTableCollectionViewElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-document-start-node/user-document-start-node.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-document-start-node/user-document-start-node.element.ts index 62a2bc0612..9916243141 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-document-start-node/user-document-start-node.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-document-start-node/user-document-start-node.element.ts @@ -1,27 +1,27 @@ -import { css, html, customElement, property, repeat, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UmbDocumentRepository } from '@umbraco-cms/backoffice/document'; -import { DocumentItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbDocumentItemModel } from '@umbraco-cms/backoffice/document'; +import { UmbDocumentItemRepository } from '@umbraco-cms/backoffice/document'; @customElement('umb-user-document-start-node') export class UmbUserDocumentStartNodeElement extends UmbLitElement { @property({ type: Array, attribute: false }) - ids: Array = []; + uniques: Array = []; @state() - _displayValue: Array = []; + _displayValue: Array = []; - #itemRepository = new UmbDocumentRepository(this); + #itemRepository = new UmbDocumentItemRepository(this); protected async firstUpdated(): Promise { - if (this.ids.length === 0) return; - const { data } = await this.#itemRepository.requestItems(this.ids); + if (this.uniques.length === 0) return; + const { data } = await this.#itemRepository.requestItems(this.uniques); this._displayValue = data || []; } render() { - if (this.ids.length < 1) { + if (this.uniques.length < 1) { return html` @@ -31,10 +31,11 @@ export class UmbUserDocumentStartNodeElement extends UmbLitElement { return repeat( this._displayValue, - (item) => item.id, + (item) => item.unique, (item) => { return html` - + + `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.stories.ts index 4f3e686298..fdbf7283c9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-input/user-input.stories.ts @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from '@storybook/web-components'; +import type { Meta, StoryObj } from '@storybook/web-components'; import './user-input.element.js'; import type { UmbUserInputElement } from './user-input.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-media-start-node/user-media-start-node.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-media-start-node/user-media-start-node.element.ts index 5cd1818857..bf74902080 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-media-start-node/user-media-start-node.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-media-start-node/user-media-start-node.element.ts @@ -1,27 +1,27 @@ import { css, html, customElement, property, repeat, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { MediaItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbMediaRepository } from '@umbraco-cms/backoffice/media'; +import type { UmbMediaItemModel } from '@umbraco-cms/backoffice/media'; +import { UmbMediaItemRepository } from '@umbraco-cms/backoffice/media'; @customElement('umb-user-media-start-node') export class UmbUserMediaStartNodeElement extends UmbLitElement { @property({ type: Array, attribute: false }) - ids: Array = []; + uniques: Array = []; @state() - _displayValue: Array = []; + _displayValue: Array = []; - #itemRepository = new UmbMediaRepository(this); + #itemRepository = new UmbMediaItemRepository(this); protected async firstUpdated(): Promise { - if (this.ids.length === 0) return; - const { data } = await this.#itemRepository.requestItems(this.ids); + if (this.uniques.length === 0) return; + const { data } = await this.#itemRepository.requestItems(this.uniques); this._displayValue = data || []; } render() { - if (this.ids.length < 1) { + if (this.uniques.length < 1) { return html` @@ -31,10 +31,11 @@ export class UmbUserMediaStartNodeElement extends UmbLitElement { return repeat( this._displayValue, - (item) => item.id, + (item) => item.unique, (item) => { return html` - + + `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-permission-setting/user-permission-setting.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-permission-setting/user-permission-setting.element.ts index ba504104d0..4392d31fbd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-permission-setting/user-permission-setting.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-permission-setting/user-permission-setting.element.ts @@ -1,4 +1,4 @@ -import { type UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-action-base.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-action-base.condition.ts index d7402c1ec6..7d4dc86a87 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-action-base.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-action-base.condition.ts @@ -1,8 +1,8 @@ -import { UmbUserDetailModel } from '../types.js'; -import { UmbUserWorkspaceContext } from '../workspace/user-workspace.context.js'; +import type { UmbUserDetailModel } from '../types.js'; +import type { UmbUserWorkspaceContext } from '../workspace/user-workspace.context.js'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import { isCurrentUser } from '@umbraco-cms/backoffice/current-user'; -import { +import type { UmbConditionConfigBase, UmbConditionControllerArguments, UmbExtensionCondition, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-delete-action.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-delete-action.condition.ts index 6b018156bd..431efbb26e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-delete-action.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-delete-action.condition.ts @@ -1,5 +1,5 @@ import { UmbUserActionConditionBase } from './user-allow-action-base.condition.js'; -import { +import type { ManifestCondition, UmbConditionConfigBase, UmbConditionControllerArguments, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-disable-action.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-disable-action.condition.ts index 7af87ee8c9..97d09e22c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-disable-action.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-disable-action.condition.ts @@ -1,6 +1,6 @@ import { UmbUserActionConditionBase } from './user-allow-action-base.condition.js'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -import { +import type { ManifestCondition, UmbConditionConfigBase, UmbConditionControllerArguments, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-enable-action.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-enable-action.condition.ts index af50746b39..a6bfc34437 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-enable-action.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-enable-action.condition.ts @@ -1,6 +1,6 @@ import { UmbUserActionConditionBase } from './user-allow-action-base.condition.js'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -import { +import type { ManifestCondition, UmbConditionConfigBase, UmbConditionControllerArguments, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-unlock-action.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-unlock-action.condition.ts index 2183c0d6d5..5905adc8c9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-unlock-action.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/conditions/user-allow-unlock-action.condition.ts @@ -1,6 +1,6 @@ import { UmbUserActionConditionBase } from './user-allow-action-base.condition.js'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -import { +import type { ManifestCondition, UmbConditionConfigBase, UmbConditionControllerArguments, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/change-password/change-user-password.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/change-password/change-user-password.action.ts index 46aac1f7a9..6409bc6eec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/change-password/change-user-password.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/change-password/change-user-password.action.ts @@ -1,19 +1,19 @@ -import { UmbChangeUserPasswordRepository } from '../../repository/change-password/change-user-password.repository.js'; +import type { UmbChangeUserPasswordRepository } from '../../repository/change-password/change-user-password.repository.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { type UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT, UMB_CHANGE_PASSWORD_MODAL, } from '@umbraco-cms/backoffice/modal'; export class UmbChangeUserPasswordEntityAction extends UmbEntityActionBase { #modalManager?: UmbModalManagerContext; - constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { - super(host, repositoryAlias, unique); + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string, entityType: string) { + super(host, repositoryAlias, unique, entityType); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManager = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/disable/disable-user.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/disable/disable-user.action.ts index d5805553ee..389273d25d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/disable/disable-user.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/disable/disable-user.action.ts @@ -1,10 +1,10 @@ -import { type UmbDisableUserRepository } from '../../repository/disable/disable-user.repository.js'; +import type { UmbDisableUserRepository } from '../../repository/disable/disable-user.repository.js'; import { UmbUserItemRepository } from '../../repository/item/user-item.repository.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { type UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT, UMB_CONFIRM_MODAL, } from '@umbraco-cms/backoffice/modal'; @@ -12,12 +12,12 @@ export class UmbDisableUserEntityAction extends UmbEntityActionBase { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManager = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/enable/enable-user.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/enable/enable-user.action.ts index 45ec73e0f5..9b2893ffad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/enable/enable-user.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/enable/enable-user.action.ts @@ -1,10 +1,10 @@ -import { type UmbEnableUserRepository } from '../../repository/enable/enable-user.repository.js'; +import type { UmbEnableUserRepository } from '../../repository/enable/enable-user.repository.js'; import { UmbUserItemRepository } from '../../repository/item/user-item.repository.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { type UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT, UMB_CONFIRM_MODAL, } from '@umbraco-cms/backoffice/modal'; @@ -12,12 +12,12 @@ export class UmbEnableUserEntityAction extends UmbEntityActionBase { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManager = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/manifests.ts index 7722238f39..552ff5bdae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/manifests.ts @@ -11,7 +11,7 @@ import { UmbEnableUserEntityAction } from './enable/enable-user.action.js'; import { UmbChangeUserPasswordEntityAction } from './change-password/change-user-password.action.js'; import { UmbUnlockUserEntityAction } from './unlock/unlock-user.action.js'; import { UmbDeleteEntityAction } from '@umbraco-cms/backoffice/entity-action'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/unlock/unlock-user.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/unlock/unlock-user.action.ts index 727ba4bd47..f1ad6e0d1b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/unlock/unlock-user.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/unlock/unlock-user.action.ts @@ -1,10 +1,10 @@ -import { type UmbUnlockUserRepository } from '../../repository/index.js'; +import type { UmbUnlockUserRepository } from '../../repository/index.js'; import { UmbUserItemRepository } from '../../repository/item/user-item.repository.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { type UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, + UMB_MODAL_MANAGER_CONTEXT, UMB_CONFIRM_MODAL, } from '@umbraco-cms/backoffice/modal'; @@ -12,12 +12,12 @@ export class UmbUnlockUserEntityAction extends UmbEntityActionBase { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManager = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/delete/delete.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/delete/delete.action.ts index 6d0ba00157..a01a74021b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/delete/delete.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/delete/delete.action.ts @@ -1,13 +1,10 @@ -import { UmbUserDetailRepository } from '../../repository/index.js'; +import type { UmbUserDetailRepository } from '../../repository/index.js'; import { html } from '@umbraco-cms/backoffice/external/lit'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { - UmbModalManagerContext, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_CONFIRM_MODAL, -} from '@umbraco-cms/backoffice/modal'; +import type { UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; export class UmbUserDeleteEntityBulkAction extends UmbEntityBulkActionBase { #modalContext?: UmbModalManagerContext; @@ -15,7 +12,7 @@ export class UmbUserDeleteEntityBulkAction extends UmbEntityBulkActionBase) { super(host, repositoryAlias, selection); - new UmbContextConsumerController(host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(host, UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/disable/disable.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/disable/disable.action.ts index 10e82ae0d7..5a2e1a7cf7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/disable/disable.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/disable/disable.action.ts @@ -1,5 +1,5 @@ -import { UmbDisableUserRepository } from '../../repository/disable/disable-user.repository.js'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbDisableUserRepository } from '../../repository/disable/disable-user.repository.js'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; export class UmbDisableUserEntityBulkAction extends UmbEntityBulkActionBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/enable/enable.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/enable/enable.action.ts index 1d0428eb7c..22ab8a58fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/enable/enable.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/enable/enable.action.ts @@ -1,6 +1,6 @@ -import { UmbEnableUserRepository } from '../../repository/enable/enable-user.repository.js'; +import type { UmbEnableUserRepository } from '../../repository/enable/enable-user.repository.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export class UmbEnableUserEntityBulkAction extends UmbEntityBulkActionBase { constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/manifests.ts index fd6c25e7de..d88c2c3316 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/manifests.ts @@ -10,7 +10,7 @@ import { UmbEnableUserEntityBulkAction } from './enable/enable.action.js'; import { UmbSetGroupUserEntityBulkAction } from './set-group/set-group.action.js'; import { UmbUnlockUserEntityBulkAction } from './unlock/unlock.action.js'; import { UmbDisableUserEntityBulkAction } from './disable/disable.action.js'; -import { ManifestEntityBulkAction } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestEntityBulkAction } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; const entityActions: Array = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/set-group/set-group.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/set-group/set-group.action.ts index b1c33bb2c8..855b2fb275 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/set-group/set-group.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/set-group/set-group.action.ts @@ -1,8 +1,9 @@ -import { UmbUserRepository } from '../../repository/user.repository.js'; +import type { UmbUserRepository } from '../../repository/user.repository.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import type { UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbSetGroupUserEntityBulkAction extends UmbEntityBulkActionBase { #modalContext?: UmbModalManagerContext; @@ -10,7 +11,7 @@ export class UmbSetGroupUserEntityBulkAction extends UmbEntityBulkActionBase) { super(host, repositoryAlias, selection); - new UmbContextConsumerController(host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(host, UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalContext = instance; //TODO: add user group picker modal diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/unlock/unlock.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/unlock/unlock.action.ts index 9b4073e218..46bde134e9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/unlock/unlock.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-bulk-actions/unlock/unlock.action.ts @@ -1,6 +1,6 @@ -import { type UmbUnlockUserRepository } from '../../repository/index.js'; +import type { UmbUnlockUserRepository } from '../../repository/index.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export class UmbUnlockUserEntityBulkAction extends UmbEntityBulkActionBase { constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/collection-action/invite-user.collection-action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/collection-action/invite-user.collection-action.ts index b0008ede7e..13eff04e73 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/collection-action/invite-user.collection-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/collection-action/invite-user.collection-action.ts @@ -1,7 +1,8 @@ import { UMB_INVITE_USER_MODAL } from '../modal/index.js'; import { UmbCollectionActionBase } from '@umbraco-cms/backoffice/collection'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbInviteUserCollectionAction extends UmbCollectionActionBase { #modalManagerContext: UmbModalManagerContext | undefined; @@ -9,7 +10,7 @@ export class UmbInviteUserCollectionAction extends UmbCollectionActionBase { constructor(host: UmbControllerHost) { super(host); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManagerContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/collection-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/collection-action/manifests.ts index d414f41f07..296eb22ea1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/collection-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/collection-action/manifests.ts @@ -1,6 +1,6 @@ import { UmbInviteUserCollectionAction } from './invite-user.collection-action.js'; import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const inviteManifest: ManifestTypes = { type: 'collectionAction', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/manifests.ts index 9175766d77..bdd9989993 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/manifests.ts @@ -2,7 +2,7 @@ import { UMB_INVITE_USER_REPOSITORY_ALIAS } from '../repository/manifests.js'; import { UMB_USER_ENTITY_TYPE } from '../../entity.js'; import { UmbResendInviteToUserEntityAction } from './resend-invite/resend-invite.action.js'; import { manifest as conditionManifest } from './resend-invite/resend-invite.action.condition.js'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/resend-invite/resend-invite.action.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/resend-invite/resend-invite.action.condition.ts index 267ae20c27..44d223d1dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/resend-invite/resend-invite.action.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/resend-invite/resend-invite.action.condition.ts @@ -1,6 +1,6 @@ import { UmbUserActionConditionBase } from '../../../conditions/user-allow-action-base.condition.js'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -import { +import type { ManifestCondition, UmbConditionConfigBase, UmbConditionControllerArguments, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/resend-invite/resend-invite.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/resend-invite/resend-invite.action.ts index df138da3b9..26875d0189 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/resend-invite/resend-invite.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/entity-action/resend-invite/resend-invite.action.ts @@ -1,16 +1,16 @@ -import { type UmbEnableUserRepository } from '../../../repository/enable/enable-user.repository.js'; +import type { UmbEnableUserRepository } from '../../../repository/enable/enable-user.repository.js'; import { UMB_RESEND_INVITE_TO_USER_MODAL } from '../../index.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { type UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { type UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbResendInviteToUserEntityAction extends UmbEntityActionBase { #modalManager?: UmbModalManagerContext; - constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { - super(host, repositoryAlias, unique); + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string, entityType: string) { + super(host, repositoryAlias, unique, entityType); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalManager = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/invite/user-invite-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/invite/user-invite-modal.element.ts index efed76bbb1..04cde4e6ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/invite/user-invite-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/invite/user-invite-modal.element.ts @@ -1,4 +1,4 @@ -import { UmbUserGroupInputElement } from '../../../../user-group/components/input-user-group/user-group-input.element.js'; +import type { UmbUserGroupInputElement } from '../../../../user-group/components/input-user-group/user-group-input.element.js'; import { UmbInviteUserRepository } from '../../repository/invite-user.repository.js'; import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/resend-invite/resend-invite-to-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/resend-invite/resend-invite-to-user-modal.element.ts index 22b54d81f5..94817665a8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/resend-invite/resend-invite-to-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/resend-invite/resend-invite-to-user-modal.element.ts @@ -1,5 +1,5 @@ import { UmbInviteUserRepository } from '../../repository/invite-user.repository.js'; -import { +import type { UmbResendInviteToUserModalData, UmbResendInviteToUserModalValue, } from './resend-invite-to-user-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user-server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user-server.data-source.ts index 8c2e71d002..8dc7d87d2d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user-server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user-server.data-source.ts @@ -1,8 +1,9 @@ import { UmbUserServerDataSource } from '../../repository/detail/user-detail.server.data-source.js'; -import { type UmbInviteUserDataSource } from './types.js'; -import { +import type { UmbInviteUserDataSource } from './types.js'; +import type { InviteUserRequestModel, - ResendInviteUserRequestModel, + ResendInviteUserRequestModel} from '@umbraco-cms/backoffice/backend-api'; +import { UserResource, } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user.repository.ts index 7ef2325c05..73b9c01692 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user.repository.ts @@ -1,7 +1,7 @@ import { UmbUserRepositoryBase } from '../../repository/user-repository-base.js'; import { UmbInviteUserServerDataSource } from './invite-user-server.data-source.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { InviteUserRequestModel, ResendInviteUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { InviteUserRequestModel, ResendInviteUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbInviteUserRepository extends UmbUserRepositoryBase { #inviteSource: UmbInviteUserServerDataSource; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/manifests.ts index 218e4595c1..5032efa8e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/manifests.ts @@ -1,5 +1,5 @@ import { UmbInviteUserRepository } from './invite-user.repository.js'; -import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_INVITE_USER_REPOSITORY_ALIAS = 'Umb.Repository.User.Invite'; const inviteRepository: ManifestRepository = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/types.ts index ca096d0a21..57e9c692c9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/types.ts @@ -1,6 +1,6 @@ -import { UmbUserDetailModel } from '../../types.js'; -import { InviteUserRequestModel, ResendInviteUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; -import { DataSourceResponse, UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbUserDetailModel } from '../../types.js'; +import type { InviteUserRequestModel, ResendInviteUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { DataSourceResponse, UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; export interface UmbInviteUserDataSource { invite(requestModel: InviteUserRequestModel): Promise>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/user-create-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/user-create-modal.element.ts index 93c7065398..55fc354eae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/user-create-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/user-create-modal.element.ts @@ -1,12 +1,13 @@ import { UmbUserDetailRepository } from '../../repository/index.js'; -import { type UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-group'; +import type { UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-group'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, query } from '@umbraco-cms/backoffice/external/lit'; +import type { + UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement, - UMB_MODAL_MANAGER_CONTEXT_TOKEN, - UMB_CREATE_USER_SUCCESS_MODAL, - UmbModalManagerContext, + UMB_MODAL_MANAGER_CONTEXT, + UMB_CREATE_USER_SUCCESS_MODAL } from '@umbraco-cms/backoffice/modal'; @customElement('umb-user-create-modal') @@ -20,7 +21,7 @@ export class UmbUserCreateModalElement extends UmbModalBaseElement { connectedCallback(): void { super.connectedCallback(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (_instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (_instance) => { this.#modalManagerContext = _instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/user-create-success-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/user-create-success-modal.element.ts index 6b9f3ef9d3..4c3ee3f279 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/user-create-success-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/user-create-success-modal.element.ts @@ -1,18 +1,12 @@ import { UmbUserItemRepository } from '../../repository/item/user-item.repository.js'; +import type { UmbUserItemModel } from '../../repository/item/types.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UUIInputPasswordElement } from '@umbraco-cms/backoffice/external/uui'; -import { - UmbNotificationDefaultData, - UmbNotificationContext, - UMB_NOTIFICATION_CONTEXT_TOKEN, -} from '@umbraco-cms/backoffice/notification'; -import { - UmbCreateUserSuccessModalData, - UmbCreateUserSuccessModalValue, - UmbModalBaseElement, -} from '@umbraco-cms/backoffice/modal'; -import { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UUIInputPasswordElement } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbNotificationDefaultData, UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbCreateUserSuccessModalData, UmbCreateUserSuccessModalValue } from '@umbraco-cms/backoffice/modal'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; @customElement('umb-user-create-success-modal') export class UmbUserCreateSuccessModalElement extends UmbModalBaseElement< @@ -20,7 +14,7 @@ export class UmbUserCreateSuccessModalElement extends UmbModalBaseElement< UmbCreateUserSuccessModalValue > { @state() - _userItem?: UserItemResponseModel; + _userItem?: UmbUserItemModel; #userItemRepository = new UmbUserItemRepository(this); #notificationContext?: UmbNotificationContext; @@ -28,7 +22,7 @@ export class UmbUserCreateSuccessModalElement extends UmbModalBaseElement< connectedCallback(): void { super.connectedCallback(); - this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => (this.#notificationContext = instance)); + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => (this.#notificationContext = instance)); } protected async firstUpdated(): Promise { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/user-picker/user-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/user-picker/user-picker-modal.element.ts index 389459999a..f4b5b96e2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/user-picker/user-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/user-picker/user-picker-modal.element.ts @@ -1,9 +1,11 @@ import { UmbUserCollectionRepository } from '../../collection/repository/user-collection.repository.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, html, customElement, state, ifDefined, PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; -import { UmbUserPickerModalData, UmbUserPickerModalValue, UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbUserPickerModalData, UmbUserPickerModalValue} from '@umbraco-cms/backoffice/modal'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; -import { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-user-picker-modal') export class UmbUserPickerModalElement extends UmbModalBaseElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/change-password/change-user-password.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/change-password/change-user-password.repository.ts index 8e3208fb04..6bcdaf481e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/change-password/change-user-password.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/change-password/change-user-password.repository.ts @@ -1,7 +1,7 @@ import { UmbUserRepositoryBase } from '../user-repository-base.js'; import { UmbChangeUserPasswordServerDataSource } from './change-user-password.server.data-source.js'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; export class UmbChangeUserPasswordRepository extends UmbUserRepositoryBase { #changePasswordSource: UmbChangeUserPasswordServerDataSource; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/types.ts index 8b45f90187..0c489315be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/types.ts @@ -1,18 +1,6 @@ -import type { - CreateUserRequestModel, - CreateUserResponseModel, - UpdateUserRequestModel, - UserResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; -import type { UmbDataSourceErrorResponse, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; -export interface IUmbUserDetailRepository - extends UmbDetailRepository< - CreateUserRequestModel, - CreateUserResponseModel, - UpdateUserRequestModel, - UserResponseModel - > { +export interface IUmbUserDetailRepository { uploadAvatar(id: string, file: File): Promise; deleteAvatar(id: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.repository.ts index ef0f10d3b2..5d5ebe2427 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.repository.ts @@ -1,10 +1,10 @@ import { UmbUserRepositoryBase } from '../user-repository-base.js'; -import { UmbUserDetailDataSource } from '../../types.js'; +import type { UmbUserDetailDataSource } from '../../types.js'; import { UmbUserServerDataSource } from './user-detail.server.data-source.js'; -import { IUmbUserDetailRepository } from './types.js'; +import type { IUmbUserDetailRepository } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbTemporaryFileRepository } from '@umbraco-cms/backoffice/temporary-file'; -import { CreateUserRequestModel, UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { CreateUserRequestModel, UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbId } from '@umbraco-cms/backoffice/id'; export class UmbUserDetailRepository extends UmbUserRepositoryBase implements IUmbUserDetailRepository { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts index bee67b87e6..8b1a119c0c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts @@ -1,14 +1,16 @@ -import { UmbUserDetailModel, UmbUserDetailDataSource } from '../../types.js'; +import type { UmbUserDetailModel, UmbUserDetailDataSource } from '../../types.js'; import { UMB_USER_ENTITY_TYPE } from '../../entity.js'; -import { +import type { DataSourceResponse, - UmbDataSourceErrorResponse, + UmbDataSourceErrorResponse} from '@umbraco-cms/backoffice/repository'; +import { extendDataSourceResponseData, } from '@umbraco-cms/backoffice/repository'; -import { +import type { CreateUserRequestModel, UpdateUserRequestModel, - UserPresentationBaseModel, + UserPresentationBaseModel} from '@umbraco-cms/backoffice/backend-api'; +import { UserResource, } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/disable-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/disable-user.server.data-source.ts index 6116753c5a..526f16f530 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/disable-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/disable-user.server.data-source.ts @@ -1,4 +1,4 @@ -import { type UmbDisableUserDataSource } from './types.js'; +import type { UmbDisableUserDataSource } from './types.js'; import { UserResource } from '@umbraco-cms/backoffice/backend-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/user/user/repository/disable/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/types.ts index 8a206deb90..968fbdf151 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/types.ts @@ -1,4 +1,4 @@ -import { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; export interface UmbDisableUserDataSource { disable(userIds: string[]): Promise; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.repository.ts index 71b8dde49b..db6442cbe3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.repository.ts @@ -1,6 +1,6 @@ import { UmbUserRepositoryBase } from '../user-repository-base.js'; import { UmbEnableUserServerDataSource } from './enable-user.server.data-source.js'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbEnableUserRepository extends UmbUserRepositoryBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.server.data-source.ts index e020b34fbd..823bc47dd1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.server.data-source.ts @@ -1,4 +1,4 @@ -import { type UmbEnableUserDataSource } from './types.js'; +import type { UmbEnableUserDataSource } from './types.js'; import { UserResource } from '@umbraco-cms/backoffice/backend-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/user/user/repository/enable/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/types.ts index 68e16426a4..f36a1f80a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/types.ts @@ -1,4 +1,4 @@ -import { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; export interface UmbEnableUserDataSource { enable(userIds: string[]): Promise; 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 index 2bdc867ee6..38e3aa6158 100644 --- 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 @@ -1,6 +1,6 @@ import { UmbUserItemStore } from './user-item.store.js'; import { UmbUserItemRepository } from './user-item.repository.js'; -import { ManifestItemStore, ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; +import type { 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'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/types.ts new file mode 100644 index 0000000000..d2811e5d91 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/types.ts @@ -0,0 +1,4 @@ +export interface UmbUserItemModel { + unique: string; + name: string; +} 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 bfd7f73841..dfc603a51b 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,10 +1,10 @@ import { UmbUserItemServerDataSource } from './user-item.server.data-source.js'; import { UMB_USER_ITEM_STORE_CONTEXT } from './user-item.store.js'; +import type { UmbUserItemModel } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; -import { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export class UmbUserItemRepository extends UmbItemRepositoryBase { +export class UmbUserItemRepository extends UmbItemRepositoryBase { constructor(host: UmbControllerHost) { super(host, UmbUserItemServerDataSource, UMB_USER_ITEM_STORE_CONTEXT); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.server.data-source.ts index fb53ae89d4..119067b248 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/item/user-item.server.data-source.ts @@ -1,7 +1,8 @@ -import type { UmbItemDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbUserItemModel } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { UserItemResponseModel, UserResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UserResource } from '@umbraco-cms/backoffice/backend-api'; +import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository'; /** * A data source for user items that fetches data from the server @@ -9,32 +10,26 @@ import { UserItemResponseModel, UserResource } from '@umbraco-cms/backoffice/bac * @class UmbUserItemServerDataSource * @implements {UmbItemDataSource} */ -export class UmbUserItemServerDataSource implements UmbItemDataSource { - #host: UmbControllerHost; - +export class UmbUserItemServerDataSource extends UmbItemServerDataSourceBase { /** * Creates an instance of UmbUserItemServerDataSource. * @param {UmbControllerHost} host * @memberof UmbUserItemServerDataSource */ constructor(host: UmbControllerHost) { - this.#host = host; - } - - /** - * Fetches the items for the given ids from the server - * @param {Array} ids - * @return {*} - * @memberof UmbUserItemServerDataSource - */ - async getItems(ids: Array) { - if (!ids) throw new Error('Ids are missing'); - - return tryExecuteAndNotify( - this.#host, - UserResource.getUserItem({ - id: ids, - }), - ); + super(host, { + getItems, + mapper, + }); } } + +/* eslint-disable local-rules/no-direct-api-import */ +const getItems = (uniques: Array) => UserResource.getUserItem({ id: uniques }); + +const mapper = (item: UserItemResponseModel): UmbUserItemModel => { + return { + unique: item.id, + name: item.name, + }; +}; 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 a14bbf062d..00c8d2fabb 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 @@ -1,31 +1,24 @@ -import type { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbUserItemModel } from './types.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbItemStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbItemStoreBase } from '@umbraco-cms/backoffice/store'; /** * @export * @class UmbUserItemStore - * @extends {UmbStoreBase} + * @extends {UmbItemStoreBase} * @description - Data Store for user items */ -export class UmbUserItemStore - extends UmbStoreBase - implements UmbItemStore -{ +// TODO: add UmbItemStoreInterface when changed to uniques +export class UmbUserItemStore extends UmbItemStoreBase { /** * Creates an instance of UmbUserItemStore. * @param {UmbControllerHostElement} host * @memberof UmbUserItemStore */ constructor(host: UmbControllerHostElement) { - super(host, UMB_USER_ITEM_STORE_CONTEXT.toString(), new UmbArrayState([], (x) => x.id)); - } - - items(ids: Array) { - return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? ''))); + super(host, UMB_USER_ITEM_STORE_CONTEXT.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-set-group.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-set-group.server.data-source.ts index b2d90a58e4..3eb373def2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-set-group.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-set-group.server.data-source.ts @@ -1,4 +1,4 @@ -import { UmbUserSetGroupDataSource } from '../../types.js'; +import type { UmbUserSetGroupDataSource } from '../../types.js'; import { UserResource } from '@umbraco-cms/backoffice/backend-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/user/user/repository/unlock/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/types.ts index 33d388bc08..53946707e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/types.ts @@ -1,4 +1,4 @@ -import { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; export interface UmbUnlockUserDataSource { unlock(userIds: string[]): Promise; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.repository.ts index 4ff8f3e402..387822e9d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.repository.ts @@ -1,6 +1,6 @@ import { UmbUserRepositoryBase } from '../user-repository-base.js'; import { UmbUnlockUserServerDataSource } from './unlock-user.server.data-source.js'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbUnlockUserRepository extends UmbUserRepositoryBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.server.data-source.ts index a710a6f87c..ce455f1353 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.server.data-source.ts @@ -1,4 +1,4 @@ -import { type UmbUnlockUserDataSource } from './types.js'; +import type { UmbUnlockUserDataSource } from './types.js'; import { UserResource } from '@umbraco-cms/backoffice/backend-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/user/user/repository/user-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user-repository-base.ts index 1cdf85f57e..038d76cfc0 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,7 +1,10 @@ -import { UMB_USER_STORE_CONTEXT_TOKEN, UmbUserStore } from './user.store.js'; -import { UMB_USER_ITEM_STORE_CONTEXT, UmbUserItemStore } from './item/user-item.store.js'; +import type { UmbUserStore } from './user.store.js'; +import { UMB_USER_STORE_CONTEXT } from './user.store.js'; +import type { UmbUserItemStore } from './item/user-item.store.js'; +import { UMB_USER_ITEM_STORE_CONTEXT } 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 type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; export class UmbUserRepositoryBase extends UmbRepositoryBase { @@ -15,7 +18,7 @@ export class UmbUserRepositoryBase extends UmbRepositoryBase { super(host); this.init = Promise.all([ - this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_USER_STORE_CONTEXT, (instance) => { this.detailStore = instance; }).asPromise(), @@ -23,7 +26,7 @@ export class UmbUserRepositoryBase extends UmbRepositoryBase { this.itemStore = instance; }).asPromise(), - this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { this.notificationContext = instance; }).asPromise(), ]); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user.repository.ts index 0749816ab4..814d229a50 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user.repository.ts @@ -1,4 +1,4 @@ -import { UmbUserSetGroupDataSource } from '../types.js'; +import type { UmbUserSetGroupDataSource } from '../types.js'; import { UmbUserSetGroupsServerDataSource } from './sources/user-set-group.server.data-source.js'; import { UmbUserRepositoryBase } from './user-repository-base.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user.store.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user.store.ts index 952fbd055d..654d48017c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/user.store.ts @@ -1,10 +1,10 @@ -import { type UmbUserDetailModel } from '../index.js'; +import type { UmbUserDetailModel } from '../index.js'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -export const UMB_USER_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbUserStore'); +export const UMB_USER_STORE_CONTEXT = new UmbContextToken('UmbUserStore'); /** * @export @@ -14,7 +14,7 @@ export const UMB_USER_STORE_CONTEXT_TOKEN = new UmbContextToken('U */ export class UmbUserStore extends UmbStoreBase { constructor(host: UmbControllerHostElement) { - super(host, UMB_USER_STORE_CONTEXT_TOKEN.toString(), new UmbArrayState([], (x) => x.id)); + super(host, UMB_USER_STORE_CONTEXT.toString(), new UmbArrayState([], (x) => x.id)); } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts index b57e801f0e..3fec9fcb40 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts @@ -8,7 +8,7 @@ import type { UserStateModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbDataSource, UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbDataSource, UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; export type UmbUserDetailModel = UserResponseModel & { entityType: 'user'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-access-settings/user-workspace-access-settings.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-access-settings/user-workspace-access-settings.element.ts index d63b9ad69c..6de90ad2e7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-access-settings/user-workspace-access-settings.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-access-settings/user-workspace-access-settings.element.ts @@ -1,12 +1,12 @@ import { UMB_USER_WORKSPACE_CONTEXT } from '../../user-workspace.context.js'; -import { html, customElement, state, css, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; -import { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; -import { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; -import { UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-group'; +import type { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; +import type { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; +import type { UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-group'; @customElement('umb-user-workspace-access-settings') export class UmbUserWorkspaceAccessSettingsElement extends UmbLitElement { @@ -85,12 +85,12 @@ export class UmbUserWorkspaceAccessSettingsElement extends UmbLitElement { #renderDocumentStartNodes() { return html` Content - `; + `; } #renderMediaStartNodes() { return html` Media - `; + `; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-info/user-workspace-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-info/user-workspace-info.element.ts index c10b796dbb..c393c9cdde 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-info/user-workspace-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-info/user-workspace-info.element.ts @@ -1,6 +1,6 @@ import { getDisplayStateFromUserStatus } from '../../../../utils.js'; import { UMB_USER_WORKSPACE_CONTEXT } from '../../user-workspace.context.js'; -import { UmbUserDetailModel } from '../../../types.js'; +import type { UmbUserDetailModel } from '../../../types.js'; import { html, customElement, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-profile-settings/user-workspace-profile-settings.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-profile-settings/user-workspace-profile-settings.element.ts index ae4f4d3af1..ff15d96eb9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-profile-settings/user-workspace-profile-settings.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-profile-settings/user-workspace-profile-settings.element.ts @@ -2,9 +2,9 @@ import { UMB_USER_WORKSPACE_CONTEXT } from '../../user-workspace.context.js'; import { html, customElement, state, ifDefined, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; -import { UmbUiCultureInputElement } from '@umbraco-cms/backoffice/localization'; +import type { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbUiCultureInputElement } from '@umbraco-cms/backoffice/localization'; @customElement('umb-user-workspace-profile-settings') export class UmbUserWorkspaceProfileSettingsElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts index 217d59907e..5cefbf8308 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace-editor.element.ts @@ -1,7 +1,8 @@ -import { type UmbUserDetailModel } from '../index.js'; +import type { UmbUserDetailModel } from '../index.js'; import { UMB_USER_ENTITY_TYPE } from '../entity.js'; -import { UmbUserWorkspaceContext } from './user-workspace.context.js'; -import { UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbUserWorkspaceContext } from './user-workspace.context.js'; +import type { UUIInputElement} from '@umbraco-cms/backoffice/external/uui'; +import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts index aa684641ac..b6a33fe970 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/user-workspace.context.ts @@ -1,11 +1,12 @@ -import { type UmbUserDetailModel } from '../types.js'; +import type { UmbUserDetailModel } from '../types.js'; import { UMB_USER_ENTITY_TYPE } from '../entity.js'; import { UmbUserDetailRepository } from '../repository/index.js'; +import type { + UmbSaveableWorkspaceContextInterface} from '@umbraco-cms/backoffice/workspace'; import { - UmbSaveableWorkspaceContextInterface, UmbEditableWorkspaceContextBase, } from '@umbraco-cms/backoffice/workspace'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextConsumerController, UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -13,13 +14,16 @@ import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; export class UmbUserWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbEditableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface { + // + public readonly repository: UmbUserDetailRepository = new UmbUserDetailRepository(this); + #currentUserContext?: typeof UMB_CURRENT_USER_CONTEXT.TYPE; - constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Workspace.User', new UmbUserDetailRepository(host)); + constructor(host: UmbControllerHost) { + super(host, 'Umb.Workspace.User'); new UmbContextConsumerController(host, UMB_CURRENT_USER_CONTEXT, (instance) => { this.#currentUserContext = instance; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/utils.test.ts b/src/Umbraco.Web.UI.Client/src/packages/user/utils.test.ts index 47fd1a9126..e38b8d6ae8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/utils.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/utils.test.ts @@ -1,11 +1,11 @@ import { expect } from '@open-wc/testing'; import { getDisplayStateFromUserStatus } from './utils.js'; -import { InterfaceColor, InterfaceLook } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIInterfaceColor, UUIInterfaceLook } from '@umbraco-cms/backoffice/external/uui'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; describe('UmbUserExtensions', () => { it('returns correct look and color from a status string', () => { - const testCases: { status: UserStateModel; look: InterfaceLook; color: InterfaceColor }[] = [ + const testCases: { status: UserStateModel; look: UUIInterfaceLook; color: UUIInterfaceColor }[] = [ { status: UserStateModel.ACTIVE, look: 'primary', color: 'positive' }, { status: UserStateModel.INACTIVE, look: 'primary', color: 'warning' }, { status: UserStateModel.INVITED, look: 'primary', color: 'warning' }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/user/utils.ts index d880a9b44b..a85969f1ae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/utils.ts @@ -1,9 +1,9 @@ -import { InterfaceColor, InterfaceLook } from '@umbraco-cms/backoffice/external/uui'; -import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UUIInterfaceColor, UUIInterfaceLook } from '@umbraco-cms/backoffice/external/uui'; +import type { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; interface DisplayStatus { - look: InterfaceLook; - color: InterfaceColor; + look: UUIInterfaceLook; + color: UUIInterfaceColor; key: string; } const userStates: DisplayStatus[] = [ diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts index 8f9ec99743..4ced20b66d 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/auth/auth-flow.ts @@ -13,6 +13,8 @@ * License for the specific language governing permissions and limitations under * the License. */ +import { UMB_STORAGE_REDIRECT_URL, UMB_STORAGE_TOKEN_RESPONSE_NAME } from './auth.context.token.js'; +import type { LocationLike, StringMap } from '@umbraco-cms/backoffice/external/openid'; import { BaseTokenRequestHandler, BasicQueryStringUtils, @@ -27,14 +29,10 @@ import { RevokeTokenRequest, TokenRequest, TokenResponse, - LocationLike, - StringMap, } from '@umbraco-cms/backoffice/external/openid'; const requestor = new FetchRequestor(); -const TOKEN_RESPONSE_NAME = 'umb:userAuthTokenResponse'; - /** * This class is needed to prevent the hash from being parsed as part of the query string. */ @@ -143,6 +141,15 @@ export class UmbAuthFlow { await this.#makeRefreshTokenRequest(response.code, codeVerifier); await this.performWithFreshTokens(); await this.#saveTokenState(); + + // Redirect to the saved state or root + let currentRoute = '/'; + const savedRoute = sessionStorage.getItem(UMB_STORAGE_REDIRECT_URL); + if (savedRoute) { + sessionStorage.removeItem(UMB_STORAGE_REDIRECT_URL); + currentRoute = savedRoute; + } + history.replaceState(null, '', currentRoute); } }); } @@ -151,17 +158,15 @@ export class UmbAuthFlow { * This method will initialize all the state needed for the auth flow. * * It will: - * - Fetch the service configuration from the server * - Check if there is a token response in local storage * - If there is a token response, check if it is valid * - If it is not valid, check if there is a new authorization to be made * - If there is a new authorization to be made, complete it * - If there is no token response, check if there is a new authorization to be made * - If there is a new authorization to be made, complete it - * - If there is no new authorization to be made, do nothing */ async setInitialState() { - const tokenResponseJson = await this.#storageBackend.getItem(TOKEN_RESPONSE_NAME); + const tokenResponseJson = await this.#storageBackend.getItem(UMB_STORAGE_TOKEN_RESPONSE_NAME); if (tokenResponseJson) { const response = new TokenResponse(JSON.parse(tokenResponseJson)); if (response.isValid()) { @@ -169,9 +174,6 @@ export class UmbAuthFlow { this.#refreshToken = this.#accessTokenResponse.refreshToken; } } - - // If no token was found, or if it was invalid, check if there is a new authorization to be made - await this.completeAuthorizationIfPossible(); } /** @@ -223,38 +225,57 @@ export class UmbAuthFlow { return !!this.#accessTokenResponse && this.#accessTokenResponse.isValid(); } + /** + * Forget all cached token state + */ + async clearTokenStorage() { + await this.#storageBackend.removeItem(UMB_STORAGE_TOKEN_RESPONSE_NAME); + + // clear the internal state + this.#accessTokenResponse = undefined; + this.#refreshToken = undefined; + } + /** * This method will sign the user out of the application. */ async signOut() { - // forget all cached token state - await this.#storageBackend.removeItem(TOKEN_RESPONSE_NAME); + const signOutPromises: Promise[] = []; + // revoke the access token if it exists if (this.#accessTokenResponse) { - // TODO: Enable this when the server supports it - // const tokenRevokeRequest = new RevokeTokenRequest({ - // token: this.#accessTokenResponse.accessToken, - // client_id: this.#clientId, - // token_type_hint: 'access_token', - // }); + const tokenRevokeRequest = new RevokeTokenRequest({ + token: this.#accessTokenResponse.accessToken, + client_id: this.#clientId, + token_type_hint: 'access_token', + }); - // await this.#tokenHandler.performRevokeTokenRequest(this.#configuration, tokenRevokeRequest); - - this.#accessTokenResponse = undefined; + signOutPromises.push(this.#tokenHandler.performRevokeTokenRequest(this.#configuration, tokenRevokeRequest)); } + // revoke the refresh token if it exists if (this.#refreshToken) { - // TODO: Enable this when the server supports it - // const tokenRevokeRequest = new RevokeTokenRequest({ - // token: this.#refreshToken, - // client_id: this.#clientId, - // token_type_hint: 'refresh_token', - // }); + const tokenRevokeRequest = new RevokeTokenRequest({ + token: this.#refreshToken, + client_id: this.#clientId, + token_type_hint: 'refresh_token', + }); - // await this.#tokenHandler.performRevokeTokenRequest(this.#configuration, tokenRevokeRequest); - - this.#refreshToken = undefined; + signOutPromises.push(this.#tokenHandler.performRevokeTokenRequest(this.#configuration, tokenRevokeRequest)); } + + // clear the internal token state + signOutPromises.push(this.clearTokenStorage()); + + // wait for all promises to settle before continuing + await Promise.allSettled(signOutPromises); + + // clear the session on the server as well + // this will redirect the user to the end session endpoint of the server + // which will redirect the user back to the client + // and the client will then try and log in again (if the user is not logged in) + // which will redirect the user to the login page + location.href = `${this.#configuration.endSessionEndpoint}?post_logout_redirect_uri=${this.#redirectUri}`; } /** @@ -293,7 +314,10 @@ export class UmbAuthFlow { */ async #saveTokenState() { if (this.#accessTokenResponse) { - await this.#storageBackend.setItem(TOKEN_RESPONSE_NAME, JSON.stringify(this.#accessTokenResponse.toJson())); + await this.#storageBackend.setItem( + UMB_STORAGE_TOKEN_RESPONSE_NAME, + JSON.stringify(this.#accessTokenResponse.toJson()), + ); } } diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.interface.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.interface.ts deleted file mode 100644 index 33b70eceac..0000000000 --- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.interface.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; - -export interface IUmbAuthContext { - isAuthorized: Observable; - - /** - * Initiates the login flow. - */ - login(): void; - - /** - * Initialise the auth flow. - */ - setInitialState(): Promise; - - /** - * Checks if there is a token and it is still valid. - */ - getIsAuthorized(): boolean; - - /** - * Gets the latest token from the Management API. - * If the token is expired, it will be refreshed. - * - * NB! The user may experience being redirected to the login screen if the token is expired. - * - * @example - * ```js - * const token = await authContext.getLatestToken(); - * const result = await fetch('https://my-api.com', { headers: { Authorization: `Bearer ${token}` } }); - * ``` - * - * @returns The latest token from the Management API - */ - getLatestToken(): Promise; - - /** - * Signs the user out by removing any tokens from the browser. - */ - signOut(): Promise; -} diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.token.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.token.ts index f1ce0984da..38907f35e4 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.token.ts @@ -1,4 +1,6 @@ -import { IUmbAuthContext } from './auth.context.interface.js'; +import type { UmbAuthContext } from './auth.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export const UMB_AUTH_CONTEXT = new UmbContextToken('UmbAuthContext'); +export const UMB_AUTH_CONTEXT = new UmbContextToken('UmbAuthContext'); +export const UMB_STORAGE_TOKEN_RESPONSE_NAME = 'umb:userAuthTokenResponse'; +export const UMB_STORAGE_REDIRECT_URL = 'umb:auth:redirect'; diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts index 7eea0b7ed5..21cbf444cd 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts @@ -1,22 +1,25 @@ -import { type IUmbAuthContext } from './auth.context.interface.js'; import { UmbAuthFlow } from './auth-flow.js'; import { UMB_AUTH_CONTEXT } from './auth.context.token.js'; -import { type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbOpenApiConfiguration } from './models/openApiConfiguration.js'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; +import { OpenAPI } from '@umbraco-cms/backoffice/backend-api'; -export class UmbAuthContext extends UmbBaseController implements IUmbAuthContext { +export class UmbAuthContext extends UmbBaseController { #isAuthorized = new UmbBooleanState(false); readonly isAuthorized = this.#isAuthorized.asObservable(); #isBypassed = false; - #backofficePath: string; - + #serverUrl; + #backofficePath; #authFlow; + #openApi = OpenAPI; constructor(host: UmbControllerHostElement, serverUrl: string, backofficePath: string, isBypassed: boolean) { super(host); this.#isBypassed = isBypassed; + this.#serverUrl = serverUrl; this.#backofficePath = backofficePath; this.#authFlow = new UmbAuthFlow(serverUrl, this.#getRedirectUrl()); @@ -26,21 +29,28 @@ export class UmbAuthContext extends UmbBaseController implements IUmbAuthContext /** * Initiates the login flow. */ - login(): void { + makeAuthorizationRequest() { return this.#authFlow.makeAuthorizationRequest(); } + /** + * Completes the login flow. + */ + completeAuthorizationRequest() { + return this.#authFlow.completeAuthorizationIfPossible(); + } + /** * Checks if the user is authorized. If Authorization is bypassed, the user is always authorized. - * @returns {boolean} True if the user is authorized, otherwise false. + * @returns True if the user is authorized, otherwise false. */ getIsAuthorized() { if (this.#isBypassed) { - this.#isAuthorized.next(true); + this.#isAuthorized.setValue(true); return true; } else { const isAuthorized = this.#authFlow.isAuthorized(); - this.#isAuthorized.next(isAuthorized); + this.#isAuthorized.setValue(isAuthorized); return isAuthorized; } } @@ -59,21 +69,80 @@ export class UmbAuthContext extends UmbBaseController implements IUmbAuthContext * * NB! The user may experience being redirected to the login screen if the token is expired. * + * @example Using the latest token + * ```js + * const token = await authContext.getLatestToken(); + * const result = await fetch('https://my-api.com', { headers: { Authorization: `Bearer ${token}` } }); + * ``` + * + * @memberof UmbAuthContext * @returns The latest token from the Management API */ getLatestToken(): Promise { return this.#authFlow.performWithFreshTokens(); } + /** + * Clears the token storage. + * @memberof UmbAuthContext + */ + clearTokenStorage() { + return this.#authFlow.clearTokenStorage(); + } + /** * Signs the user out by removing any tokens from the browser. - * @return {*} {Promise} * @memberof UmbAuthContext */ signOut(): Promise { return this.#authFlow.signOut(); } + /** + * Get the server url to the Management API. + * @memberof UmbAuthContext + * @example Using the server url + * ```js + * const serverUrl = authContext.getServerUrl(); + * OpenAPI.BASE = serverUrl; + * ``` + * @example + * ```js + * const serverUrl = authContext.getServerUrl(); + * const token = await authContext.getLatestToken(); + * const result = await fetch(`${serverUrl}/umbraco/management/api/v1/my-resource`, { headers: { Authorization: `Bearer ${token}` } }); + * ``` + * @returns The server url to the Management API + */ + getServerUrl() { + return this.#serverUrl; + } + + /** + * Get the default OpenAPI configuration, which is set up to communicate with the Management API. + * @remark This is useful if you want to communicate with your own resources generated by the [openapi-typescript-codegen](https://github.com/ferdikoomen/openapi-typescript-codegen) library. + * @memberof UmbAuthContext + * + * @example Using the default OpenAPI configuration + * ```js + * const defaultOpenApi = authContext.getOpenApiConfiguration(); + * OpenAPI.BASE = defaultOpenApi.base; + * OpenAPI.WITH_CREDENTIALS = defaultOpenApi.withCredentials; + * OpenAPI.CREDENTIALS = defaultOpenApi.credentials; + * OpenAPI.TOKEN = defaultOpenApi.token; + * ``` + * @returns The default OpenAPI configuration + */ + getOpenApiConfiguration(): UmbOpenApiConfiguration { + return { + base: OpenAPI.BASE, + version: OpenAPI.VERSION, + withCredentials: OpenAPI.WITH_CREDENTIALS, + credentials: OpenAPI.CREDENTIALS, + token: () => this.getLatestToken(), + }; + } + #getRedirectUrl() { return `${window.location.origin}${this.#backofficePath}`; } diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/index.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/index.ts index f2e7f83bb1..e6dc7d478d 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/auth/index.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/auth/index.ts @@ -1,3 +1,3 @@ -export * from './auth.context.interface.js'; export * from './auth.context.js'; export * from './auth.context.token.js'; +export * from './models/openApiConfiguration.js'; diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/models/openApiConfiguration.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/models/openApiConfiguration.ts new file mode 100644 index 0000000000..0bdc8ea97a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/shared/auth/models/openApiConfiguration.ts @@ -0,0 +1,32 @@ +/** + * Configuration for the OpenAPI (Umbraco) server. This is used to communicate with the Management API. + * This is useful if you want to configure your Fetch, Axios or other HTTP client to communicate with the Management API. + * If you use the recommended resource generator [openapi-typescript-codegen](https://github.com/ferdikoomen/openapi-typescript-codegen) this can be used to configure the `OpenAPI` object. + */ +export interface UmbOpenApiConfiguration { + /** + * The base URL of the OpenAPI (Umbraco) server. + */ + readonly base: string; + + /** + * The configured version of the Management API to use. + */ + readonly version: string; + + /** + * The `withCredentials` option for the Fetch API. + */ + readonly withCredentials: boolean; + + /** + * The `credentials` option for the Fetch API. + */ + readonly credentials: 'include' | 'omit' | 'same-origin'; + + /** + * The token to use for the Authorization header. + * @returns A resolver for the token to use for the Authorization header. + */ + readonly token: () => Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/shared/icon-registry/icon.stories.ts b/src/Umbraco.Web.UI.Client/src/shared/icon-registry/icon.stories.ts index 5f9aa40124..a9720878ef 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/icon-registry/icon.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/icon-registry/icon.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from '@storybook/web-components'; +import type { Meta, Story } from '@storybook/web-components'; import icons from '../../../src/shared/icon-registry/icons/icons.json'; import { html, repeat } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/shared/resources/resource.controller.ts b/src/Umbraco.Web.UI.Client/src/shared/resources/resource.controller.ts index c3c769f97c..16b3a99a80 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/resources/resource.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/resources/resource.controller.ts @@ -1,11 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { isApiError, isCancelError, isCancelablePromise } from './apiTypeValidators.function.js'; -import { - UmbNotificationContext, - UMB_NOTIFICATION_CONTEXT_TOKEN, - UmbNotificationOptions, -} from '@umbraco-cms/backoffice/notification'; -import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UMB_NOTIFICATION_CONTEXT, type UmbNotificationOptions } from '@umbraco-cms/backoffice/notification'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; @@ -13,14 +9,14 @@ import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; export class UmbResourceController extends UmbBaseController { #promise: Promise; - #notificationContext?: UmbNotificationContext; + #notificationContext?: typeof UMB_NOTIFICATION_CONTEXT.TYPE; constructor(host: UmbControllerHost, promise: Promise, alias?: string) { super(host, alias); this.#promise = promise; - new UmbContextConsumerController(host, UMB_NOTIFICATION_CONTEXT_TOKEN, (_instance) => { + new UmbContextConsumerController(host, UMB_NOTIFICATION_CONTEXT, (_instance) => { this.#notificationContext = _instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/shared/router/route.context.ts b/src/Umbraco.Web.UI.Client/src/shared/router/route.context.ts index 7804270ad3..4ccf9d156a 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/router/route.context.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/router/route.context.ts @@ -2,9 +2,9 @@ import type { UmbRoute } from './route.interface.js'; import { createRoutePathBuilder } from './generate-route-path-builder.function.js'; import type { IRoutingInfo, IRouterSlot } from '@umbraco-cms/backoffice/external/router-slot'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { type UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalRouteRegistration } from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT, type UmbModalRouteRegistration } from '@umbraco-cms/backoffice/modal'; const EmptyDiv = document.createElement('div'); @@ -14,7 +14,7 @@ export class UmbRouteContext extends UmbBaseController { #mainRouter: IRouterSlot; #modalRouter: IRouterSlot; #modalRegistrations: UmbModalRouteRegistration[] = []; - #modalContext?: typeof UMB_MODAL_MANAGER_CONTEXT_TOKEN.TYPE; + #modalContext?: typeof UMB_MODAL_MANAGER_CONTEXT.TYPE; #modalRoutes: UmbRoutePlusModalKey[] = []; #routerBasePath?: string; #routerActiveLocalPath?: string; @@ -24,8 +24,8 @@ export class UmbRouteContext extends UmbBaseController { super(host); this.#mainRouter = mainRouter; this.#modalRouter = modalRouter; - this.provideContext(UMB_ROUTE_CONTEXT_TOKEN, this); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (context) => { + this.provideContext(UMB_ROUTE_CONTEXT, this); + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (context) => { this.#modalContext = context; this.#generateModalRoutes(); }); @@ -154,4 +154,4 @@ export class UmbRouteContext extends UmbBaseController { }; } -export const UMB_ROUTE_CONTEXT_TOKEN = new UmbContextToken('UmbRouterContext'); +export const UMB_ROUTE_CONTEXT = new UmbContextToken('UmbRouterContext'); diff --git a/src/Umbraco.Web.UI.Client/src/shared/router/router-slot.element.ts b/src/Umbraco.Web.UI.Client/src/shared/router/router-slot.element.ts index ecb82db0d6..bf06a735a2 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/router/router-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/router/router-slot.element.ts @@ -1,9 +1,9 @@ import '@umbraco-cms/backoffice/external/router-slot'; import { UmbRouterSlotInitEvent } from './router-slot-init.event.js'; import { UmbRouterSlotChangeEvent } from './router-slot-change.event.js'; -import { css, html, PropertyValueMap, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, type PropertyValueMap, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbRouteContext, UmbRoute, IRouterSlot } from '@umbraco-cms/backoffice/router'; +import { UmbRouteContext, type UmbRoute, type IRouterSlot } from '@umbraco-cms/backoffice/router'; /** * @element umb-router-slot diff --git a/src/Umbraco.Web.UI.Client/src/shared/router/variant-router-slot.element.ts b/src/Umbraco.Web.UI.Client/src/shared/router/variant-router-slot.element.ts index 5082053103..5f631aeed6 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/router/variant-router-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/router/variant-router-slot.element.ts @@ -1,7 +1,7 @@ import { UmbRouterSlotElement } from './router-slot.element.js'; import { customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { UmbRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; function variantIdsToString(variantIds: UmbVariantId[]): string { return variantIds.map((id) => id.toString()).join('_&_'); diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/component-has-manifest-property.function.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/component-has-manifest-property.function.ts index 95bb4c05eb..0316d08536 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/utils/component-has-manifest-property.function.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/utils/component-has-manifest-property.function.ts @@ -1,4 +1,4 @@ -import { ManifestBase } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestBase } from '@umbraco-cms/backoffice/extension-api'; export function componentHasManifestProperty( component: HTMLElement, diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/index.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/index.ts index 82aa802544..fae5270f48 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/utils/index.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/utils/index.ts @@ -11,6 +11,7 @@ export * from './path-folder-name.function.js'; export * from './selection-manager/selection.manager.js'; export * from './udi.js'; export * from './umbraco-path.function.js'; +export * from './math.js'; export * from './split-string-to-array.js'; declare global { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-image-cropper/mathUtils.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/math.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/components/input-image-cropper/mathUtils.ts rename to src/Umbraco.Web.UI.Client/src/shared/utils/math.ts diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/pagination-manager/pagination.manager.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/pagination-manager/pagination.manager.ts index c72384ff88..148e6850fa 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/utils/pagination-manager/pagination.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/utils/pagination-manager/pagination.manager.ts @@ -23,7 +23,7 @@ export class UmbPaginationManager extends EventTarget { * @memberof UmbPaginationManager */ public setPageSize(pageSize: number) { - this.#pageSize.next(pageSize); + this.#pageSize.setValue(pageSize); this.#calculateTotalPages(); } @@ -51,7 +51,7 @@ export class UmbPaginationManager extends EventTarget { * @memberof UmbPaginationManager */ public setTotalItems(totalItems: number) { - this.#totalItems.next(totalItems); + this.#totalItems.setValue(totalItems); this.#calculateTotalPages(); } @@ -87,7 +87,7 @@ export class UmbPaginationManager extends EventTarget { pageNumber = this.#totalPages.getValue(); } - this.#currentPage.next(pageNumber); + this.#currentPage.setValue(pageNumber); this.#calculateSkip(); this.dispatchEvent(new UmbChangeEvent()); } @@ -107,7 +107,7 @@ export class UmbPaginationManager extends EventTarget { */ #calculateTotalPages() { const totalPages = Math.ceil(this.#totalItems.getValue() / this.#pageSize.getValue()); - this.#totalPages.next(totalPages); + this.#totalPages.setValue(totalPages); /* If we currently are on a page higher than the total pages. We need to reset the current page to the last page. This can happen if we have a filter that returns less items than the current page size. */ @@ -118,6 +118,6 @@ export class UmbPaginationManager extends EventTarget { #calculateSkip() { const skip = (this.#currentPage.getValue() - 1) * this.#pageSize.getValue(); - this.#skip.next(skip); + this.#skip.setValue(skip); } } diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts index 477a6d3daa..9451be884d 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts @@ -1,5 +1,5 @@ import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbArrayState, UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; @@ -37,7 +37,7 @@ export class UmbSelectionManager extends UmbBaseController { * @memberof UmbSelectionManager */ public setSelectable(value: boolean) { - this.#selectable.next(value); + this.#selectable.setValue(value); } /** @@ -58,7 +58,7 @@ export class UmbSelectionManager extends UmbBaseController { if (this.getSelectable() === false) return; if (value === undefined) throw new Error('Value cannot be undefined'); const newSelection = this.getMultiple() ? value : value.slice(0, 1); - this.#selection.next(newSelection); + this.#selection.setValue(newSelection); } /** @@ -76,7 +76,7 @@ export class UmbSelectionManager extends UmbBaseController { * @memberof UmbSelectionManager */ public setMultiple(value: boolean) { - this.#multiple.next(value); + this.#multiple.setValue(value); /* If multiple is set to false, and the current selection is more than one, then we need to set the selection to the first item. */ @@ -104,7 +104,7 @@ export class UmbSelectionManager extends UmbBaseController { if (this.getSelectable() === false) return; if (this.isSelected(unique)) return; const newSelection = this.getMultiple() ? [...this.getSelection(), unique] : [unique]; - this.#selection.next(newSelection); + this.#selection.setValue(newSelection); this.getHostElement().dispatchEvent(new UmbSelectionChangeEvent()); } @@ -116,7 +116,7 @@ export class UmbSelectionManager extends UmbBaseController { public deselect(unique: string | null) { if (this.getSelectable() === false) return; const newSelection = this.getSelection().filter((x) => x !== unique); - this.#selection.next(newSelection); + this.#selection.setValue(newSelection); this.getHostElement().dispatchEvent(new UmbSelectionChangeEvent()); } @@ -136,6 +136,6 @@ export class UmbSelectionManager extends UmbBaseController { */ public clearSelection() { if (this.getSelectable() === false) return; - this.#selection.next([]); + this.#selection.setValue([]); } } diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx index 1dfa36306a..ed7f7f9ce7 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/context-api.mdx @@ -32,9 +32,9 @@ new UmbContextConsumerController(host, 'requestThisContextAlias', (context) => { Using a Context Token gives you a typed context: ```ts -import { UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (context) => { +this.consumeContext(UMB_NOTIFICATION_CONTEXT, (context) => { // Notice this is a subscription, as context might change or a new one appears, but the value is strongly typed console.log("I've got the context of the right type", context); }); @@ -52,7 +52,7 @@ type MyContext = { bar: number; }; -const MY_CONTEXT_TOKEN = new ContextToken('My.Context.Token'); +const MY_CONTEXT = new ContextToken('My.Context.Token'); ``` #### Context Token with discriminator. @@ -79,39 +79,38 @@ import { ContextToken } from '@umbraco-cms/backoffice/context'; interface MyBaseContext { foo: string; bar: number; -}; +} interface MyPublishableContext extends MyBaseContext { - publish() -}; + publish(); +} -const MY_PUBLISHABLE_CONTEXT_TOKEN = new ContextToken('My.Context.Token', (context): context is MyPublishableContext => { - return 'publish' in context; -}); +const MY_PUBLISHABLE_CONTEXT = new ContextToken( + 'My.Context.Token', + (context): context is MyPublishableContext => { + return 'publish' in context; + }, +); ``` Implementation of context token example: ```ts - const contextElement = new UmbLitElement(); -contextElement.provideContext(MY_PUBLISHABLE_CONTEXT_TOKEN, new MyPublishableContext()); - +contextElement.provideContext(MY_PUBLISHABLE_CONTEXT, new MyPublishableContext()); const consumerElement = new UmbLitElement(); contextElement.appendChild(contextElement); -consumerElement.consumeContext(MY_PUBLISHABLE_CONTEXT_TOKEN, (context) => { +consumerElement.consumeContext(MY_PUBLISHABLE_CONTEXT, (context) => { // context is of type 'MyPublishableContext' console.log("I've got the context of the right type", context); }); - ``` This enables implementors to request a publishable context, without the knowledge about how do identify such, neither they need to know about the Type. In details, the Context API will find the first API matching alias 'My.Context.Token', and never look furhter. If that API does live up to the type discriminator, it will be returned. If not the consumer will never reply. - ### Provide a Context API. From a Umbraco Element or Umbraco Controller: diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/entity-actions.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/entity-actions.mdx index 298ec0ed24..725b5253c4 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/entity-actions.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/entity-actions.mdx @@ -131,14 +131,14 @@ If any additional contexts are needed, these can be consumed from the host eleme ```ts import { UmbEntityActionBase } from '@umbraco-cms/entity-action'; import { UmbContextConsumerController } from '@umbraco-cms/controller'; -import { UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal'; +import { UMB_MODAL_SERVICE_CONTEXT } from '@umbraco-cms/modal'; import { MyRepository } from './my-repository'; export class MyEntityAction extends UmbEntityActionBase { constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - new UmbContextConsumerController(this.host, UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => { + new UmbContextConsumerController(this.host, UMB_MODAL_SERVICE_CONTEXT, (instance) => { this.#modalService = instance; }); } @@ -184,10 +184,12 @@ const manifest = { label: 'My Entity Bulk Action', repositoryAlias: 'My.Repository', }, - conditions: [{ - alias: 'Umb.Condition.CollectionAlias', - match: 'my-collection-alias', - }], + conditions: [ + { + alias: 'Umb.Condition.CollectionAlias', + match: 'my-collection-alias', + }, + ], }; extensionRegistry.register(manifest); diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/registration/conditions.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/registration/conditions.mdx index 5b8ad78caa..9caf2def5d 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/registration/conditions.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/registration/conditions.mdx @@ -58,7 +58,7 @@ import { UmbConditionControllerArguments, UmbExtensionCondition, } from '@umbraco-cms/backoffice/extension-api'; -import { UMB_SECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/section'; +import { UMB_SECTION_CONTEXT } from '@umbraco-cms/backoffice/section'; type MyConditionConfig = UmbConditionConfigBase & { match: string; diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/modal/modal.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/modal/modal.mdx index fffcca25be..9ab2a75e24 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/modal/modal.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/modal/modal.mdx @@ -181,7 +181,7 @@ class MyElement extends UmbElementMixin(LitElement) { constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_CONTEXT, (instance) => { this.#modalManagerContext = instance; // modalManagerContext is now ready to be used }); diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/modal/story-modal-service-example.element.ts b/src/Umbraco.Web.UI.Client/storybook/stories/modal/story-modal-service-example.element.ts index 4b7bb14968..c873568000 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/modal/story-modal-service-example.element.ts +++ b/src/Umbraco.Web.UI.Client/storybook/stories/modal/story-modal-service-example.element.ts @@ -1,6 +1,6 @@ import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT, UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; @customElement('umb-story-modal-context-example') export class UmbStoryModalContextExampleElement extends UmbLitElement { @@ -14,7 +14,7 @@ export class UmbStoryModalContextExampleElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => { + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this._modalContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/umb-element.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/umb-element.mdx index bfca0776f6..9798bee7f7 100644 --- a/src/Umbraco.Web.UI.Client/storybook/stories/umb-element.mdx +++ b/src/Umbraco.Web.UI.Client/storybook/stories/umb-element.mdx @@ -27,9 +27,9 @@ this.consumeContext('requestThisContextAlias', (context) => { Or use the a Context Token to get a typed context: ```ts -import { UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (context) => { +this.consumeContext(UMB_NOTIFICATION_CONTEXT, (context) => { // Notice this is a subscription, as context might change or a new one appears, but the value is strongly typed console.log("I've got the context", context); }); diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 93e0cfd9d6..44613790d5 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -69,9 +69,9 @@ "@umbraco-cms/backoffice/entity-action": ["src/packages/core/entity-action"], "@umbraco-cms/backoffice/entity-bulk-action": ["src/packages/core/entity-bulk-action"], "@umbraco-cms/backoffice/extension-registry": ["src/packages/core/extension-registry"], + "@umbraco-cms/backoffice/server-file-system": ["src/packages/core/server-file-system"], "@umbraco-cms/backoffice/id": ["src/packages/core/id"], "@umbraco-cms/backoffice/localization": ["src/packages/core/localization"], - "@umbraco-cms/backoffice/macro": ["src/packages/core/macro"], "@umbraco-cms/backoffice/menu": ["src/packages/core/menu"], "@umbraco-cms/backoffice/modal": ["src/packages/core/modal"], "@umbraco-cms/backoffice/notification": ["src/packages/core/notification"], @@ -91,6 +91,7 @@ "@umbraco-cms/backoffice/temporary-file": ["src/packages/core/temporary-file"], "@umbraco-cms/backoffice/data-type": ["./src/packages/core/data-type/index.ts"], + "@umbraco-cms/backoffice/dynamic-root": ["./src/packages/dynamic-root/index.ts"], "@umbraco-cms/backoffice/language": ["./src/packages/settings/languages/index.ts"], "@umbraco-cms/backoffice/logviewer": ["src/packages/log-viewer/index.ts"], "@umbraco-cms/backoffice/relation-types": ["src/packages/relations/relation-types/index.ts"], diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs index 0b6264800e..cc927945b1 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -69,9 +69,9 @@ export default { '@umbraco-cms/backoffice/entity-action': './src/packages/core/entity-action/index.ts', '@umbraco-cms/backoffice/entity-bulk-action': './src/packages/core/entity-bulk-action/index.ts', '@umbraco-cms/backoffice/extension-registry': './src/packages/core/extension-registry/index.ts', + '@umbraco-cms/backoffice/server-file-system': './src/packages/core/server-file-system/index.ts', '@umbraco-cms/backoffice/id': './src/packages/core/id/index.ts', '@umbraco-cms/backoffice/localization': './src/packages/core/localization/index.ts', - '@umbraco-cms/backoffice/macro': './src/packages/core/macro/index.ts', '@umbraco-cms/backoffice/menu': './src/packages/core/menu/index.ts', '@umbraco-cms/backoffice/modal': './src/packages/core/modal/index.ts', '@umbraco-cms/backoffice/notification': './src/packages/core/notification/index.ts', @@ -106,6 +106,7 @@ export default { '@umbraco-cms/backoffice/package': './src/packages/packages/package/index.ts', '@umbraco-cms/backoffice/data-type': './src/packages/core/data-type/index.ts', + '@umbraco-cms/backoffice/dynamic-root': './src/packages/dynamic-root/index.ts', '@umbraco-cms/backoffice/language': './src/packages/settings/languages/index.ts', '@umbraco-cms/backoffice/logviewer': './src/packages/settings/logviewer/index.ts', '@umbraco-cms/backoffice/relation-type': './src/packages/relations/relation-types/index.ts', @@ -156,6 +157,9 @@ export default { if (args[0].indexOf('Lit is in dev mode.') === 0) { return; } + if (args[0].indexOf('Multiple versions of Lit loaded.') === 0) { + return; + } systemWarn(...args); };